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
bug-binutils@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-binutils

Reply via email to