tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: eh_globals.o in libstdc++.a not relocatable?



ld: /usr/lib/libstdc++.a(eh_globals.o): relocation R_X86_64_TPOFF32 against `_ZZN12_GLOBAL__N_110get_globalEvE6global' can not be used w hen making a shared object; recompile with -fPIC


This is telling you that _that_ object (and by extension the library itself)
hasn't been compiled with -fPIC.

Q1: Why is this linking against the system libstdc++ instead of the
    recently compiled one?

Q2: If it really needs the system library (unlikely!) why doesn't it link
    against the shared library libstdc++.so?

On the other hand:

$ ar x /usr/lib/libstdc++.a eh_globals.o
$ file eh_globals.o
eh_globals.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

so eh_globals.o seems to be relocatable?


Not compiled with `-fPIC' though. This is the eh_globals.o from /usr/lib/libstdc++.a

```
$ readelf -r eh_globals.o | c++filt

Relocation section with addend (.rela.text):
r_offset     r_info       r_type              st_value         st_name + r_addend
00000000000b 000300000017 R_X86_64_TPOFF32    0000000000000000 (anonymous namespace)::get_global()::global + 0
00000000001b 000300000017 R_X86_64_TPOFF32    0000000000000000 (anonymous namespace)::get_global()::global + 0

Relocation section with addend (.rela.eh_frame):
r_offset     r_info       r_type              st_value         st_name + r_addend
000000000020 000200000002 R_X86_64_PC32       0000000000000000 .text + 0
000000000034 000200000002 R_X86_64_PC32       0000000000000000 .text + 10
$
```

This is the one from gcc-12.2.0 on Linux, where I configured GCC with
--enable-shared.

```
$ readelf -r eh_globals.o | c++filt

Relocation section with addend (.rela.text.__cxa_get_globals_fast):
r_offset     r_info       r_type              st_value         st_name + r_addend
00000000000b 000200000014 R_X86_64_TLSLD      0000000000000000 (anonymous namespace)::get_global()::global + fffffffffffffffc
000000000010 000e00000004 R_X86_64_PLT32      0000000000000000 __tls_get_addr + fffffffffffffffc
00000000001a 000200000015 R_X86_64_DTPOFF32   0000000000000000 (anonymous namespace)::get_global()::global + 0

Relocation section with addend (.rela.text.__cxa_get_globals):
r_offset     r_info       r_type              st_value         st_name + r_addend
00000000000b 000200000014 R_X86_64_TLSLD      0000000000000000 (anonymous namespace)::get_global()::global + fffffffffffffffc
000000000010 000e00000004 R_X86_64_PLT32      0000000000000000 __tls_get_addr + fffffffffffffffc
00000000001a 000200000015 R_X86_64_DTPOFF32   0000000000000000 (anonymous namespace)::get_global()::global + 0

Relocation section with addend (.rela.eh_frame):
r_offset     r_info       r_type              st_value         st_name + r_addend
000000000020 000100000002 R_X86_64_PC32       0000000000000000 .text.__cxa_get_globals_fast + 0
000000000038 000300000002 R_X86_64_PC32       0000000000000000 .text.__cxa_get_globals + 0
$
```

Note `R_X86_64_TLSLD' type and the reference to `__tls_get_addr' when `-fPIC'
is used when creating the object.

-RVP


Home | Main Index | Thread Index | Old Index