https://sourceware.org/bugzilla/show_bug.cgi?id=24458
Bug ID: 24458
Summary: Linker BFD 2.32 regression: __ehdr_start not useable
in shared libraries: "relocation R_X86_64_PC32 against
undefined symbol `__ehdr_start' can not be used when
making a shared object; recompile with -fPIC"
Product: binutils
Version: 2.32
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: ld
Assignee: unassigned at sourceware dot org
Reporter: Arfrever.FTA at GMail dot Com
Target Milestone: ---
$ cat test.cpp
extern char __ehdr_start;
int main() {
char x = __ehdr_start;
}
Linker BFD 2.31 prints some unrelated warnings, but works:
$ g++ -fuse-ld=bfd -o test test.cpp
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
$ echo $?
0
$ g++ -fuse-ld=bfd -shared -fPIC -o test.so test.cpp
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/libgcc.a(_muldi3.o): unable to
initialize decompress status for section .debug_info
$ echo $?
0
Linker GOLD 2.31 works:
$ g++ -fuse-ld=gold -o test test.cpp
$ echo $?
0
$ g++ -fuse-ld=gold -shared -fPIC -o test.so test.cpp
$ echo $?
0
Linker BFD 2.32 works for executables, but fails for shared libraries:
$ g++ -fuse-ld=bfd -o test test.cpp
$ echo $?
0
$ g++ -fuse-ld=bfd -shared -fPIC -o test.so test.cpp
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
/tmp/cc6cOEh1.o: relocation R_X86_64_PC32 against undefined symbol
`__ehdr_start' can not be used when making a shared object; recompile with
-fPIC
/usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../x86_64-pc-linux-gnu/bin/ld.bfd:
final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
$ echo $?
1
Linker GOLD 2.32 works:
$ g++ -fuse-ld=gold -o test test.cpp
$ echo $?
0
$ g++ -fuse-ld=gold -shared -fPIC -o test.so test.cpp
$ echo $?
0
Linker LLD 8.0.0 works:
$ clang++ -fuse-ld=lld -o test test.cpp
$ echo $?
0
$ clang++ -fuse-ld=lld -shared -fPIC -o test.so test.cpp
$ echo $?
0
(__ehdr_start symbol is defined in glibc's static library. glibc 2.29 is built
with GCC 8.3.0 and linker BFD 2.32.)
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
bug-binutils mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-binutils