https://sourceware.org/bugzilla/show_bug.cgi?id=33223
Bug ID: 33223
Summary: ppc64le: ld.bfd segfaults on (invalid) object file
with unknown relocation
Product: binutils
Version: 2.44
Status: UNCONFIRMED
Severity: minor
Priority: P2
Component: ld
Assignee: unassigned at sourceware dot org
Reporter: sourceware-bugzilla at mhxnet dot de
Target Milestone: ---
When cross-compiling libucontext-1.3.2 [1] for ppc64le, I'm running into the
following segfault when using ld.bfd:
```
$ CC=clang CFLAGS='--target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2'
LDFLAGS='--target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2
-static-libgcc -fuse-ld=bfd' make ARCH=ppc64le
clang -std=gnu99 -D_DEFAULT_SOURCE -fPIC -DPIC
--target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2 -Iinclude
-Iarch/ppc64 -Iarch/common -Iarch/common/include -DFORCE_SOFT_FLOAT
-DEXPORT_UNPREFIXED -c -o arch/ppc64/makecontext.o arch/ppc64/makecontext.c
clang -std=gnu99 -D_DEFAULT_SOURCE -fPIC -DPIC
--target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2 -Iinclude
-Iarch/ppc64 -Iarch/common -Iarch/common/include -DFORCE_SOFT_FLOAT
-DEXPORT_UNPREFIXED -c -o arch/ppc64/retfromsyscall.o
arch/ppc64/retfromsyscall.c
clang -fPIC -DPIC --target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2
-Iinclude -Iarch/ppc64 -Iarch/common -Iarch/common/include -DFORCE_SOFT_FLOAT
-DEXPORT_UNPREFIXED -Wa,--noexecstack -c -o arch/ppc64/getcontext.o
arch/ppc64/getcontext.S
clang -fPIC -DPIC --target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2
-Iinclude -Iarch/ppc64 -Iarch/common -Iarch/common/include -DFORCE_SOFT_FLOAT
-DEXPORT_UNPREFIXED -Wa,--noexecstack -c -o arch/ppc64/setcontext.o
arch/ppc64/setcontext.S
clang -fPIC -DPIC --target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2
-Iinclude -Iarch/ppc64 -Iarch/common -Iarch/common/include -DFORCE_SOFT_FLOAT
-DEXPORT_UNPREFIXED -Wa,--noexecstack -c -o arch/ppc64/startcontext.o
arch/ppc64/startcontext.S
clang -fPIC -DPIC --target=ppc64le-alpine-linux-musl --sysroot=/opt/cross/O2
-Iinclude -Iarch/ppc64 -Iarch/common -Iarch/common/include -DFORCE_SOFT_FLOAT
-DEXPORT_UNPREFIXED -Wa,--noexecstack -c -o arch/ppc64/swapcontext.o
arch/ppc64/swapcontext.S
clang -fPIC -o libucontext.so -shared -Wl,-soname,libucontext.so.1
-Wl,-z,noexecstack arch/ppc64/makecontext.o arch/ppc64/retfromsyscall.o
arch/ppc64/getcontext.o arch/ppc64/setcontext.o arch/ppc64/startcontext.o
arch/ppc64/swapcontext.o --target=ppc64le-alpine-linux-musl
--sysroot=/opt/cross/O2 -static-libgcc -fuse-ld=bfd
clang: error: unable to execute command: Segmentation fault
clang: error: linker command failed due to signal (use -v to see invocation)
make: *** [Makefile:127: libucontext.so] Error 1
```
Clang is generating an object file with an unknown/unrecognized relocation from
the assembly input; this is a separate issue [2]:
```
$ clang --target=ppc64le-alpine-linux-musl -Iarch/common -Wa,--noexecstack -c
-o arch/ppc64/startcontext.o arch/ppc64/startcontext.S
$ readelf -r arch/ppc64/startcontext.o
Relocation section '.rela.text' at offset 0xc8 contains 1 entry:
Offset Info Type Sym. Value Sym. Name +
Addend
000000000020 000300000012 unrecognized: 12 0000000000000000 exit + 0
```
Both ld.mold and ld.lld handle this gracefully reporting an error instead of
crashing:
```
ld.lld: error: arch/ppc64/startcontext.o:(.text+0x20): unknown relocation (18)
against symbol exit
```
```
mold: error: arch/ppc64/startcontext.o:(.text): unknown relocation: unknown
(0x12)
```
This is ld.bfd from binutils-2.44 without any patches:
```
$ /opt/cross/O2/usr/ppc64le-alpine-linux-musl/bin/ld.bfd -V
GNU ld (GNU Binutils) 2.44
Supported emulations:
elf64lppc
elf32lppc
elf32lppclinux
elf32lppcsim
elf64ppc
elf32ppc
elf32ppclinux
elf32ppcsim
```
Please let me know if you need any more information.
[1] https://github.com/kaniini/libucontext
[2] https://github.com/llvm/llvm-project/issues/150913
--
You are receiving this mail because:
You are on the CC list for the bug.