mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
1f599d0e7b
Always turn hidden and internal symbols which have a dynamic index into local ones. This is required by the the ELF gABI[1]: "A hidden symbol contained in a relocatable object must be either removed or converted to STB_LOCAL binding by the link-editor when the relocatable object is included in an executable file or shared object." "An internal symbol contained in a relocatable object must be either removed or converted to STB_LOCAL binding by the link-editor when the relocatable object is included in an executable file or shared object." The ELF linker usually respects this requirement, however in the case where a dynamic symbol has been preallocated due to a reference of the default export class aka visibility from the object being linked, and then merged with a hidden or internal symbol definition from within the same object, then the original export class is carried over to the output dynamic symbol table, because while merging the generic ELF linker only converts affected dynamic symbols to local when they are defined or referenced by the object being linked and a dynamic object involved in the link both at a time. The dynamic symbol produced confuses then the dynamic loader at the run time -- the hidden or internal export class is ignored and the symbol follows preemption rules as with the default export class. In the MIPS target it happens when `mips_elf_record_global_got_symbol' creates a dynamic symbol when a call relocation is encountered. Additionally if the undefined symbol referred by such a relocation does specify the intended export class, then a local dynamic symbol is created instead, which is harmless and allowed, but useless. Normally no local dynamic symbols are created, except for a single dummy one at the beginning. Correct the problem by removing the extra check for a dynamic symbol being defined or referenced by the object being linked and a dynamic object involved in the link both at a time. The test cases included cover the internal and hidden symbol cases, as well as a protected symbol for a reference, the handling of which is unchanged by this fix. Both cases described above are covered, that is where an internal or hidden dynamic symbol is produced and where a local one is. NB this change affects CRIS results where some symbols in the static table produced in a final link are now converted from STV_HIDDEN to STB_LOCAL. This happens whenever the `elf_backend_hide_symbol' handler is called, so the affected symbols must have been chosen for entering into the dynamic symbol table, except in these test cases no such symbol table is produced. In fully linked binaries the static symbol table is only used for debugging though, so such a change is fine. References: [1] "System V Application Binary Interface - DRAFT - 24 April 2001", The Santa Cruz Operation, Inc., "Symbol Table", <http://www.sco.com/developers/gabi/2001-04-24/ch4.symtab.html> bfd/ PR ld/19908 * elflink.c (elf_link_add_object_symbols): Always turn hidden and internal symbols which have a dynamic index into local ones. ld/ PR ld/19908 * testsuite/ld-cris/tls-e-20.d: Adjust for hidden symbol handling fix. * testsuite/ld-cris/tls-e-20a.d: Likewise. * testsuite/ld-cris/tls-e-21.d: Likewise. * testsuite/ld-cris/tls-e-23.d: Likewise. * testsuite/ld-cris/tls-e-80.d: Likewise. * testsuite/ld-cris/tls-gd-3h.d: Likewise. * testsuite/ld-cris/tls-leie-19.d: Likewise. * testsuite/ld-mips-elf/export-class-ref-lib.sd: New test. * testsuite/ld-mips-elf/export-hidden-ref.sd: New test. * testsuite/ld-mips-elf/export-internal-ref.sd: New test. * testsuite/ld-mips-elf/export-protected-ref.sd: New test. * testsuite/ld-mips-elf/export-class-ref-f0.s: New test source. * testsuite/ld-mips-elf/export-class-ref-f1.s: New test source. * testsuite/ld-mips-elf/export-class-ref-f2.s: New test source. * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
113 lines
3.8 KiB
Makefile
113 lines
3.8 KiB
Makefile
#source: start1.s
|
|
#source: got7.s
|
|
#source: tls128.s
|
|
#source: tls-gd-2.s
|
|
#source: tls-ld-6.s
|
|
#source: tls-ie-10.s
|
|
#source: tls-hx.s
|
|
#source: tls-hx1x2.s
|
|
#as: --no-underscore --em=criself -I$srcdir/$subdir --pic
|
|
#ld: -m crislinux
|
|
#objdump: -d -s -h -t -r -p
|
|
|
|
# Like tls-e-20.d but with an offset for all TLS GOT entries, and an
|
|
# offset for all TLS data we care about. Offsets different for TLS
|
|
# than for GOT.
|
|
|
|
.*: file format elf32-cris
|
|
|
|
Program Header:
|
|
LOAD off 0x0+ vaddr 0x0+80000 paddr 0x0+80000 align 2\*\*13
|
|
filesz 0x0+dc memsz 0x0+dc flags r-x
|
|
LOAD off 0x0+dc vaddr 0x0+820dc paddr 0x0+820dc align 2\*\*13
|
|
filesz 0x0+e4 memsz 0x0+e4 flags rw-
|
|
TLS off 0x0+dc vaddr 0x0+820dc paddr 0x0+820dc align 2\*\*2
|
|
filesz 0x0+8c memsz 0x0+8c flags r--
|
|
private flags = 0:
|
|
|
|
Sections:
|
|
Idx Name Size VMA LMA File off Algn
|
|
0 \.text 0+48 0+80094 0+80094 0+94 2\*\*1
|
|
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
|
1 \.tdata 0+8c 0+820dc 0+820dc 0+dc 2\*\*2
|
|
CONTENTS, ALLOC, LOAD, DATA, THREAD_LOCAL
|
|
2 \.got 0+3c 0+82168 0+82168 0+168 2\*\*2
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
3 \.data 0+1c 0+821a4 0+821a4 0+1a4 2\*\*0
|
|
CONTENTS, ALLOC, LOAD, DATA
|
|
SYMBOL TABLE:
|
|
0+80094 l d \.text 0+ \.text
|
|
0+820dc l d \.tdata 0+ \.tdata
|
|
0+82168 l d \.got 0+ \.got
|
|
0+821a4 l d \.data 0+ \.data
|
|
0+ l df \*ABS\* 0+ .*
|
|
0+ l \.tdata 0+80 tls128
|
|
0+ l df \*ABS\* 0+ .*
|
|
0+80 l \.tdata 0+4 x
|
|
0+82168 l O \.got 0+ _GLOBAL_OFFSET_TABLE_
|
|
0+800c4 g F \.text 0+6 tlsdsofn2
|
|
0+821b4 g O \.data 0+4 got7var5
|
|
0+88 g \.tdata 0+4 \.hidden x2
|
|
0+821ac g O \.data 0+4 got7var3
|
|
0+821bc g O \.data 0+4 got7var7
|
|
0+80098 g F \.text 0+2a got7fn
|
|
0+821b8 g O \.data 0+4 got7var6
|
|
0+80094 g \.text 0+ _start
|
|
0+821c0 g \.data 0+ __bss_start
|
|
0+821a4 g O \.data 0+4 got7var1
|
|
0+821b0 g O \.data 0+4 got7var4
|
|
0+800cc g F \.text 0+6 tlsdsofn
|
|
0+84 g \.tdata 0+4 \.hidden x1
|
|
0+821c0 g \.data 0+ _edata
|
|
0+821c0 g \.data 0+ _end
|
|
0+821a8 g O \.data 0+4 got7var2
|
|
0+800d4 g F \.text 0+6 tlsdsofn10
|
|
|
|
Contents of section \.text:
|
|
#...
|
|
Contents of section \.tdata:
|
|
820dc 2f000000 00000000 00000000 00000000 .*
|
|
820ec 00000000 00000000 00000000 00000000 .*
|
|
820fc 00000000 00000000 00000000 00000000 .*
|
|
8210c 00000000 00000000 00000000 00000000 .*
|
|
8211c 00000000 00000000 00000000 00000000 .*
|
|
8212c 00000000 00000000 00000000 00000000 .*
|
|
8213c 00000000 00000000 00000000 00000000 .*
|
|
8214c 00000000 00000000 00000000 00000000 .*
|
|
8215c 28000000 29000000 2a000000 .*
|
|
Contents of section \.got:
|
|
82168 00000000 00000000 00000000 01000000 .*
|
|
82178 00000000 f4ffffff 01000000 80000000 .*
|
|
82188 b4210800 ac210800 bc210800 b8210800 .*
|
|
82198 a4210800 b0210800 a8210800 .*
|
|
Contents of section \.data:
|
|
821a4 00000000 00000000 00000000 00000000 .*
|
|
821b4 00000000 00000000 00000000 .*
|
|
|
|
Disassembly of section \.text:
|
|
|
|
00080094 <_start>:
|
|
80094: 41b2 moveq 1,\$r11
|
|
#...
|
|
00080098 <got7fn>:
|
|
80098: 6fae 3000 0000 move\.d 30 <tls128\+0x30>,\$r10
|
|
8009e: 6fae 3800 0000 move\.d 38 <tls128\+0x38>,\$r10
|
|
800a4: 6fae 2400 0000 move\.d 24 <tls128\+0x24>,\$r10
|
|
800aa: 6fae 3400 0000 move\.d 34 <tls128\+0x34>,\$r10
|
|
800b0: 6fae 2000 0000 move\.d 20 <tls128\+0x20>,\$r10
|
|
800b6: 6fae 2c00 0000 move\.d 2c <tls128\+0x2c>,\$r10
|
|
800bc: 6fae 2800 0000 move\.d 28 <tls128\+0x28>,\$r10
|
|
#...
|
|
|
|
000800c4 <tlsdsofn2>:
|
|
800c4: 6fae 1800 0000 move\.d 18 <tls128\+0x18>,\$r10
|
|
#...
|
|
|
|
000800cc <tlsdsofn>:
|
|
800cc: 6fae 8000 0000 move\.d 80 <x>,\$r10
|
|
#...
|
|
|
|
000800d4 <tlsdsofn10>:
|
|
800d4: 6fae 1400 0000 move\.d 14 <tls128\+0x14>,\$r10
|
|
#...
|