mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
f26a32876b
It is possible to create shared libraries on PowerPC using -ftls-model=inital-exec or -ftls-model=local-exec. The first is half reasonable, getting you a shared library that can't be dlopen'd but otherwise is reasonable. The second is quite bad. Not only do you lose being able to dlopen, the library also has dynamic text relocations. Worse, the TPREL16_LO, TPREL16_HA and other TPREL16 dynamic relocs emitted were wrong, resulting in wrong values being applied by ld.so. Using the first TLS section symbol in dynamic relocations for local TLS symbols doesn't work. It's wrong because TLS symbols used by TLS relocs have values relative to the TLS segment, whereas the TLS section symbols are addresses. This patch instead uses a symbol index of zero which is used elsewhere by PowerPC on dynamic TLS relocs. It's not strictly ABI compliant to use a non-TLS symbol with TLS relocs but symbol index zero can be interpreted as "no symbol". Not using the first TLS section symbol means it doesn't need to be dynamic. The patch also fixes a further problem with PowerPC32 dynamic TPREL16* relocs, which shouldn't have the symbol value in the addend as we do for non-TLS symbols. bfd/ * elflink.c (_bfd_elf_omit_section_dynsym_default): Don't keep tls_sec. (_bfd_elf_init_1_index_section): Prefer not using TLS sections. (_bfd_elf_init_2_index_sections): Likewise. * elf64-ppc.c (ppc64_elf_relocate_section): When emitting dynamic relocations for local TLS symbols, use STN_UNDEF as the relocation symbol. * elf32-ppc.c (ppc_elf_relocate_section): Likewise, and don't leave TLS symbol value in the addend. ld/ * testsuite/ld-powerpc/tlsso.r: Update. * testsuite/ld-powerpc/tlsso32.g: Update. * testsuite/ld-powerpc/tlsso32.r: Update. * testsuite/ld-powerpc/tlstocso.r: Update. * testsuite/ld-cris/tls-dso-dtpoffd2.d: Update. * testsuite/ld-cris/tls-dso-dtpoffd4.d: Update. * testsuite/ld-cris/tls-dso-tpoffgotcomm1.d: Update. * testsuite/ld-cris/tls-gd-1.d: Update. * testsuite/ld-cris/tls-gd-1h.d: Update. * testsuite/ld-cris/tls-gd-2.d: Update. * testsuite/ld-cris/tls-gd-2h.d: Update. * testsuite/ld-cris/tls-ie-10.d: Update. * testsuite/ld-cris/tls-ie-11.d: Update. * testsuite/ld-cris/tls-ie-8.d: Update. * testsuite/ld-cris/tls-ie-9.d: Update. * testsuite/ld-cris/tls-js1.d: Update. * testsuite/ld-cris/tls-ld-4.d: Update. * testsuite/ld-cris/tls-ld-5.d: Update. * testsuite/ld-cris/tls-ld-6.d: Update. * testsuite/ld-cris/tls-ld-7.d: Update. * testsuite/ld-cris/tls-ldgd-14.d: Update. * testsuite/ld-cris/tls-ldgd-15.d: Update. * testsuite/ld-cris/tls-ldgdx-14.d: Update. * testsuite/ld-cris/tls-ldgdx-15.d: Update. * testsuite/ld-cris/tls-local-54.d: Update. * testsuite/ld-cris/tls-local-60.d: Update. * testsuite/ld-cris/tls-local-61.d: Update. * testsuite/ld-cris/tls-local-63.d: Update. * testsuite/ld-cris/tls-local-64.d: Update. * testsuite/ld-cris/tls-ok-30.d: Update. * testsuite/ld-cris/tls-ok-32.d: Update. * testsuite/ld-cris/tls-ok-34.d: Update. * testsuite/ld-mips-elf/tls-multi-got-1.got: Update. * testsuite/ld-mips-elf/tls-multi-got-1.r: Update. * testsuite/ld-mips-elf/tlsdyn-pie-o32.d: Update. * testsuite/ld-mips-elf/tlsdyn-pie-o32.got: Update. * testsuite/ld-mips-elf/tlslib-o32-hidden.got: Update. * testsuite/ld-mips-elf/tlslib-o32-ver.got: Update. * testsuite/ld-mips-elf/tlslib-o32.got: Update. * testsuite/ld-s390/tlspic.rd: Update. * testsuite/ld-s390/tlspic_64.rd: Update. * testsuite/ld-sparc/tlssunnopic32.rd: Update. * testsuite/ld-sparc/tlssunnopic64.rd: Update. * testsuite/ld-sparc/tlssunpic32.rd: Update. * testsuite/ld-sparc/tlssunpic64.rd: Update.
131 lines
4.3 KiB
R
131 lines
4.3 KiB
R
#source: tlssunpic32.s
|
|
#source: tlspic.s
|
|
#as: --32 -K PIC
|
|
#ld: -shared -melf32_sparc
|
|
#readelf: -WSsrl
|
|
#target: sparc*-*-*
|
|
|
|
There are [0-9]+ section headers, starting at offset 0x[0-9a-f]+:
|
|
|
|
Section Headers:
|
|
+\[Nr\] Name +Type +Addr +Off +Size +ES Flg Lk Inf Al
|
|
+\[[ 0-9]+\] +NULL +0+ 0+ 0+ 0+ +0 +0 +0
|
|
+\[[ 0-9]+\] .hash +.*
|
|
+\[[ 0-9]+\] .dynsym +.*
|
|
+\[[ 0-9]+\] .dynstr +.*
|
|
+\[[ 0-9]+\] .rela.dyn +.*
|
|
+\[[ 0-9]+\] .rela.plt +.*
|
|
+\[[ 0-9]+\] .text +PROGBITS +0+1000 0+1000 0+1000 0+ +AX +0 +0 4096
|
|
+\[[ 0-9]+\] .tdata +PROGBITS +0+12000 0+2000 0+60 0+ WAT +0 +0 +4
|
|
+\[[ 0-9]+\] .tbss +NOBITS +0+12060 0+2060 0+20 0+ WAT +0 +0 +4
|
|
+\[[ 0-9]+\] .dynamic +DYNAMIC +0+12060 0+2060 0+98 08 +WA +3 +0 +4
|
|
+\[[ 0-9]+\] .got +PROGBITS +0+120f8 0+20f8 0+4c 04 +WA +0 +0 +4
|
|
+\[[ 0-9]+\] .plt +.*
|
|
+\[[ 0-9]+\] .symtab +.*
|
|
+\[[ 0-9]+\] .strtab +.*
|
|
+\[[ 0-9]+\] .shstrtab +.*
|
|
#...
|
|
|
|
Elf file type is DYN \(Shared object file\)
|
|
Entry point 0x1000
|
|
There are [0-9]+ program headers, starting at offset [0-9]+
|
|
|
|
Program Headers:
|
|
+Type +Offset +VirtAddr +PhysAddr +FileSiz MemSiz +Flg Align
|
|
+LOAD +0x0+ 0x0+ 0x0+ 0x0+2000 0x0+2000 R E 0x10000
|
|
+LOAD +0x0+2000 0x0+12000 0x0+12000 0x0+184 0x0+184 RWE 0x10000
|
|
+DYNAMIC +0x0+2060 0x0+12060 0x0+12060 0x0+98 0x0+98 RW +0x4
|
|
+TLS +0x0+2000 0x0+12000 0x0+12000 0x0+60 0x0+80 R +0x4
|
|
#...
|
|
|
|
Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 14 entries:
|
|
Offset +Info +Type +Sym. Value +Symbol's Name \+ Addend
|
|
[0-9a-f ]+R_SPARC_TLS_DTPMOD32 +0
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +24
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +30
|
|
[0-9a-f ]+R_SPARC_TLS_DTPMOD32 +0
|
|
[0-9a-f ]+R_SPARC_TLS_DTPMOD32 +0
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +64
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +50
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +70
|
|
[0-9a-f ]+R_SPARC_TLS_DTPMOD32 +0
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +44
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +0+10 +sg5 \+ 0
|
|
[0-9a-f ]+R_SPARC_TLS_DTPMOD32 +0+ +sg1 \+ 0
|
|
[0-9a-f ]+R_SPARC_TLS_DTPOFF32 +0+ +sg1 \+ 0
|
|
[0-9a-f ]+R_SPARC_TLS_TPOFF32 +0+4 +sg2 \+ 0
|
|
|
|
Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entry:
|
|
Offset +Info +Type +Sym. Value +Symbol's Name \+ Addend
|
|
[0-9a-f ]+R_SPARC_JMP_SLOT +0+ +__tls_get_addr \+ 0
|
|
|
|
Symbol table '\.dynsym' contains [0-9]+ entries:
|
|
+Num: +Value +Size +Type +Bind +Vis +Ndx +Name
|
|
.* NOTYPE +LOCAL +DEFAULT +UND *
|
|
.* SECTION +LOCAL +DEFAULT +6 *
|
|
.* SECTION +LOCAL +DEFAULT +10 *
|
|
.* TLS +GLOBAL +DEFAULT +7 sg8
|
|
.* TLS +GLOBAL +DEFAULT +7 sg3
|
|
.* TLS +GLOBAL +DEFAULT +7 sg4
|
|
.* TLS +GLOBAL +DEFAULT +7 sg5
|
|
.* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
|
|
.* TLS +GLOBAL +DEFAULT +7 sg1
|
|
.* FUNC +GLOBAL +DEFAULT +6 fn1
|
|
.* TLS +GLOBAL +DEFAULT +7 sg2
|
|
.* TLS +GLOBAL +DEFAULT +7 sg6
|
|
.* TLS +GLOBAL +DEFAULT +7 sg7
|
|
|
|
Symbol table '\.symtab' contains [0-9]+ entries:
|
|
+Num: +Value +Size +Type +Bind +Vis +Ndx +Name
|
|
.* NOTYPE +LOCAL +DEFAULT +UND *
|
|
.* SECTION +LOCAL +DEFAULT +1 *
|
|
.* SECTION +LOCAL +DEFAULT +2 *
|
|
.* SECTION +LOCAL +DEFAULT +3 *
|
|
.* SECTION +LOCAL +DEFAULT +4 *
|
|
.* SECTION +LOCAL +DEFAULT +5 *
|
|
.* SECTION +LOCAL +DEFAULT +6 *
|
|
.* SECTION +LOCAL +DEFAULT +7 *
|
|
.* SECTION +LOCAL +DEFAULT +8 *
|
|
.* SECTION +LOCAL +DEFAULT +9 *
|
|
.* SECTION +LOCAL +DEFAULT +10 *
|
|
.* SECTION +LOCAL +DEFAULT +11 *
|
|
.* FILE +LOCAL +DEFAULT +ABS .*
|
|
.* TLS +LOCAL +DEFAULT +7 sl1
|
|
.* TLS +LOCAL +DEFAULT +7 sl2
|
|
.* TLS +LOCAL +DEFAULT +7 sl3
|
|
.* TLS +LOCAL +DEFAULT +7 sl4
|
|
.* TLS +LOCAL +DEFAULT +7 sl5
|
|
.* TLS +LOCAL +DEFAULT +7 sl6
|
|
.* TLS +LOCAL +DEFAULT +7 sl7
|
|
.* TLS +LOCAL +DEFAULT +7 sl8
|
|
.* FILE +LOCAL +DEFAULT +ABS
|
|
.* TLS +LOCAL +DEFAULT +8 sH1
|
|
.* OBJECT +LOCAL +DEFAULT +ABS _DYNAMIC
|
|
.* TLS +LOCAL +DEFAULT +7 sh3
|
|
.* TLS +LOCAL +DEFAULT +8 sH2
|
|
.* TLS +LOCAL +DEFAULT +8 sH7
|
|
.* OBJECT +LOCAL +DEFAULT +ABS _PROCEDURE_LINKAGE_TABLE_
|
|
.* TLS +LOCAL +DEFAULT +7 sh7
|
|
.* TLS +LOCAL +DEFAULT +7 sh8
|
|
.* TLS +LOCAL +DEFAULT +8 sH4
|
|
.* TLS +LOCAL +DEFAULT +7 sh4
|
|
.* TLS +LOCAL +DEFAULT +8 sH3
|
|
.* TLS +LOCAL +DEFAULT +7 sh5
|
|
.* TLS +LOCAL +DEFAULT +8 sH5
|
|
.* TLS +LOCAL +DEFAULT +8 sH6
|
|
.* TLS +LOCAL +DEFAULT +8 sH8
|
|
.* TLS +LOCAL +DEFAULT +7 sh1
|
|
.* OBJECT +LOCAL +DEFAULT +ABS _GLOBAL_OFFSET_TABLE_
|
|
.* TLS +LOCAL +DEFAULT +7 sh2
|
|
.* TLS +LOCAL +DEFAULT +7 sh6
|
|
.* TLS +GLOBAL +DEFAULT +7 sg8
|
|
.* TLS +GLOBAL +DEFAULT +7 sg3
|
|
.* TLS +GLOBAL +DEFAULT +7 sg4
|
|
.* TLS +GLOBAL +DEFAULT +7 sg5
|
|
.* NOTYPE +GLOBAL +DEFAULT +UND __tls_get_addr
|
|
.* TLS +GLOBAL +DEFAULT +7 sg1
|
|
.* FUNC +GLOBAL +DEFAULT +6 fn1
|
|
.* TLS +GLOBAL +DEFAULT +7 sg2
|
|
.* TLS +GLOBAL +DEFAULT +7 sg6
|
|
.* TLS +GLOBAL +DEFAULT +7 sg7
|