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.
72 lines
1.8 KiB
Makefile
72 lines
1.8 KiB
Makefile
#source: tls128g.s
|
|
#source: tls-ld-5.s
|
|
#source: tls-gd-1.s
|
|
#source: tls-ldgd-14.s
|
|
#source: tls-x.s
|
|
#source: tls-z.s
|
|
#source: tls-hx1x2.s
|
|
#as: --pic --no-underscore --em=criself
|
|
#ld: --shared -m crislinux --hash-style=sysv
|
|
#objdump: -s -t -R -p -T
|
|
|
|
# Check that we have proper NPTL/TLS markings and GOT for two
|
|
# R_CRIS_16_GOT_GD and two R_CRIS_16_DTPRELs against different
|
|
# variables in a DSO.
|
|
|
|
.*: file format elf32-cris
|
|
|
|
Program Header:
|
|
LOAD off 0x0+ vaddr 0x0+ paddr 0x0+ align 2\*\*13
|
|
filesz 0x0+1c8 memsz 0x0+1c8 flags r-x
|
|
LOAD off 0x0+1c8 vaddr 0x0+21c8 paddr 0x0+21c8 align 2\*\*13
|
|
filesz 0x0+124 memsz 0x0+124 flags rw-
|
|
DYNAMIC off 0x0+258 vaddr 0x0+2258 paddr 0x0+2258 align 2\*\*2
|
|
filesz 0x0+70 memsz 0x0+70 flags rw-
|
|
TLS off 0x0+1c8 vaddr 0x0+21c8 paddr 0x0+21c8 align 2\*\*2
|
|
filesz 0x0+90 memsz 0x0+90 flags r--
|
|
|
|
Dynamic Section:
|
|
HASH 0x0+b4
|
|
STRTAB 0x0+168
|
|
SYMTAB 0x0+e8
|
|
STRSZ 0x0+2a
|
|
SYMENT 0x0+10
|
|
RELA 0x0+194
|
|
RELASZ 0x0+24
|
|
RELAENT 0x0+c
|
|
private flags = 0:
|
|
|
|
SYMBOL TABLE:
|
|
#...
|
|
0+8c l \.tdata 0+4 x2
|
|
#...
|
|
0+88 l \.tdata 0+4 x1
|
|
#...
|
|
0+80 g \.tdata 0+4 x
|
|
#...
|
|
0+84 g \.tdata 0+4 z
|
|
#...
|
|
DYNAMIC SYMBOL TABLE:
|
|
#...
|
|
0+80 g D \.tdata 0+4 x
|
|
#...
|
|
0+84 g D \.tdata 0+4 z
|
|
#...
|
|
|
|
DYNAMIC RELOCATION RECORDS
|
|
OFFSET TYPE VALUE
|
|
0+22d4 R_CRIS_DTPMOD \*ABS\*
|
|
0+22dc R_CRIS_DTP x
|
|
0+22e4 R_CRIS_DTP z
|
|
|
|
Contents of section \.hash:
|
|
#...
|
|
Contents of section \.text:
|
|
01b8 5fae8800 5fbe8c00 5fae1400 5fae1c00 .*
|
|
Contents of section .tdata:
|
|
#...
|
|
Contents of section \.got:
|
|
22c8 58220+ 0+ 0+ 0+ .*
|
|
22d8 0+ 0+ 0+ 0+ .*
|
|
22e8 0+ .*
|