* elf32-m68k.c (elf_m68k_copy_indirect_symbol): Propagate non_got_ref
value. (elf_m68k_check_relocs): Handle dynamic TLS relocations. Handle non_got_ref field. (elf_m68k_adjust_dynamic_symbol): Handle non_got_ref field. * tls-def-1.s, tls-def-1.d, tls-gd-1.d2, tls-gd-1.d3, tls-main-1.s, * tls-main-1.d: New files. * m68k.exp: Run new TLS tests.
This commit is contained in:
parent
f7922329bf
commit
e5f2b1de7c
@ -1,3 +1,11 @@
|
||||
2009-08-26 Maxim Kuvyrkov <maxim@codesourcery.com>
|
||||
|
||||
* elf32-m68k.c (elf_m68k_copy_indirect_symbol): Propagate
|
||||
non_got_ref value.
|
||||
(elf_m68k_check_relocs): Handle dynamic TLS relocations.
|
||||
Handle non_got_ref field.
|
||||
(elf_m68k_adjust_dynamic_symbol): Handle non_got_ref field.
|
||||
|
||||
2009-08-26 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
PR ld/10515
|
||||
|
@ -2487,6 +2487,10 @@ elf_m68k_copy_indirect_symbol (struct bfd_link_info *info,
|
||||
dir = elf_m68k_hash_entry (_dir);
|
||||
ind = elf_m68k_hash_entry (_ind);
|
||||
|
||||
/* Any absolute non-dynamic relocations against an indirect or weak
|
||||
definition will be against the target symbol. */
|
||||
_dir->non_got_ref |= _ind->non_got_ref;
|
||||
|
||||
/* We might have a direct symbol already having entries in the GOTs.
|
||||
Update its key only in case indirect symbol has GOT entries and
|
||||
assert that both indirect and direct symbols don't have GOT entries
|
||||
@ -2581,6 +2585,14 @@ elf_m68k_check_relocs (abfd, info, sec, relocs)
|
||||
case R_68K_TLS_IE16:
|
||||
case R_68K_TLS_IE32:
|
||||
|
||||
case R_68K_TLS_TPREL32:
|
||||
case R_68K_TLS_DTPREL32:
|
||||
|
||||
if (ELF32_R_TYPE (rel->r_info) == R_68K_TLS_TPREL32
|
||||
&& info->shared)
|
||||
/* Do the special chorus for libraries with static TLS. */
|
||||
info->flags |= DF_STATIC_TLS;
|
||||
|
||||
/* This symbol requires a global offset table entry. */
|
||||
|
||||
if (dynobj == NULL)
|
||||
@ -2739,6 +2751,10 @@ elf_m68k_check_relocs (abfd, info, sec, relocs)
|
||||
/* Make sure a plt entry is created for this symbol if it
|
||||
turns out to be a function defined by a dynamic object. */
|
||||
h->plt.refcount++;
|
||||
|
||||
if (!info->shared)
|
||||
/* This symbol needs a non-GOT reference. */
|
||||
h->non_got_ref = 1;
|
||||
}
|
||||
|
||||
/* If we are creating a shared library, we need to copy the
|
||||
@ -2946,6 +2962,9 @@ elf_m68k_gc_sweep_hook (bfd *abfd,
|
||||
case R_68K_TLS_IE16:
|
||||
case R_68K_TLS_IE32:
|
||||
|
||||
case R_68K_TLS_TPREL32:
|
||||
case R_68K_TLS_DTPREL32:
|
||||
|
||||
if (got == NULL)
|
||||
{
|
||||
got = elf_m68k_get_bfd2got_entry (elf_m68k_multi_got (info),
|
||||
@ -3159,6 +3178,11 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
||||
if (info->shared)
|
||||
return TRUE;
|
||||
|
||||
/* If there are no references to this symbol that do not use the
|
||||
GOT, we don't need to generate a copy reloc. */
|
||||
if (!h->non_got_ref)
|
||||
return TRUE;
|
||||
|
||||
if (h->size == 0)
|
||||
{
|
||||
(*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
|
||||
|
@ -1,3 +1,13 @@
|
||||
2009-08-26 Maxim Kuvyrkov <maxim@codesourcery.com>
|
||||
|
||||
* ld-m68k/tls-def-1.s: New file.
|
||||
* ld-m68k/tls-def-1.d: New file.
|
||||
* ld-m68k/tls-gd-1.d2: New file.
|
||||
* ld-m68k/tls-gd-1.d3: New file.
|
||||
* ld-m68k/tls-main-1.s: New file.
|
||||
* ld-m68k/tls-main-1.d: New file.
|
||||
* ld-m68k/m68k.exp: Run new TLS tests.
|
||||
|
||||
2009-08-23 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* ld-powerpc/powerpc.exp: Move relaxing and relocatable relaxing
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Expect script for run_dump_test based ld-m68k tests.
|
||||
# Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
# Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of the GNU Binutils.
|
||||
#
|
||||
@ -74,4 +74,20 @@ if { [istarget m68k-*-linux*] } then {
|
||||
run_dump_test "tls-ie-1"
|
||||
run_dump_test "tls-ld-1"
|
||||
run_dump_test "tls-ld-2"
|
||||
|
||||
set m68k_tls_tests {
|
||||
{"TLS definition"
|
||||
"-shared" "" {tls-def-1.s}
|
||||
{{nm -ngD tls-def-1.d}}
|
||||
"tls-def-1.so"}
|
||||
{"TLS direct symbol use"
|
||||
"-shared tmpdir/tls-def-1.so" "" {tls-gd-1.s}
|
||||
{{nm -ngD tls-gd-1.d2} {readelf -d tls-gd-1.d3}}
|
||||
"tls-gd-1.so"}
|
||||
{"TLS indirect symbol use"
|
||||
"tmpdir/tls-gd-1.so -rpath-link ./" "" {tls-main-1.s}
|
||||
{{readelf -d tls-main-1.d}}
|
||||
"tls-main-1"}}
|
||||
|
||||
run_ld_link_tests $m68k_tls_tests
|
||||
}
|
||||
|
4
ld/testsuite/ld-m68k/tls-def-1.d
Normal file
4
ld/testsuite/ld-m68k/tls-def-1.d
Normal file
@ -0,0 +1,4 @@
|
||||
00000000 B x
|
||||
.*
|
||||
.*
|
||||
.*
|
9
ld/testsuite/ld-m68k/tls-def-1.s
Normal file
9
ld/testsuite/ld-m68k/tls-def-1.s
Normal file
@ -0,0 +1,9 @@
|
||||
#NO_APP
|
||||
.globl x
|
||||
.section .tbss,"awT",@nobits
|
||||
.align 2
|
||||
.type x, @object
|
||||
.size x, 4
|
||||
x:
|
||||
.zero 4
|
||||
.section .note.GNU-stack,"",@progbits
|
5
ld/testsuite/ld-m68k/tls-gd-1.d2
Normal file
5
ld/testsuite/ld-m68k/tls-gd-1.d2
Normal file
@ -0,0 +1,5 @@
|
||||
.* U x
|
||||
.*
|
||||
.*
|
||||
.*
|
||||
.*
|
13
ld/testsuite/ld-m68k/tls-gd-1.d3
Normal file
13
ld/testsuite/ld-m68k/tls-gd-1.d3
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
Dynamic section at offset .* contains .*:
|
||||
* Tag * Type * Name/Value
|
||||
0x00000001 \(NEEDED\) * Shared library: \[tmpdir/tls-def-1.so\]
|
||||
0x00000004 \(HASH\) .*
|
||||
0x00000005 \(STRTAB\) .*
|
||||
0x00000006 \(SYMTAB\) .*
|
||||
0x0000000a \(STRSZ\) .*
|
||||
0x0000000b \(SYMENT\) .*
|
||||
0x00000007 \(RELA\) .*
|
||||
0x00000008 \(RELASZ\) .*
|
||||
0x00000009 \(RELAENT\) .*
|
||||
0x00000000 \(NULL\) .*
|
15
ld/testsuite/ld-m68k/tls-main-1.d
Normal file
15
ld/testsuite/ld-m68k/tls-main-1.d
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
Dynamic section at offset .* contains .*:
|
||||
* Tag * Type * Name/Value
|
||||
0x00000001 \(NEEDED\) * Shared library: \[tmpdir/tls-gd-1.so\]
|
||||
0x00000001 \(NEEDED\) * Shared library: \[tls-def-1.so\]
|
||||
0x00000004 \(HASH\) .*
|
||||
0x00000005 \(STRTAB\) .*
|
||||
0x00000006 \(SYMTAB\) .*
|
||||
0x0000000a \(STRSZ\) .*
|
||||
0x0000000b \(SYMENT\) .*
|
||||
0x00000015 \(DEBUG\) .*
|
||||
0x00000007 \(RELA\) .*
|
||||
0x00000008 \(RELASZ\) .*
|
||||
0x00000009 \(RELAENT\) .*
|
||||
0x00000000 \(NULL\) .*
|
19
ld/testsuite/ld-m68k/tls-main-1.s
Normal file
19
ld/testsuite/ld-m68k/tls-main-1.s
Normal file
@ -0,0 +1,19 @@
|
||||
#NO_APP
|
||||
.text
|
||||
.align 2
|
||||
.globl main
|
||||
.type main, @function
|
||||
.globl _start
|
||||
.type _start, @function
|
||||
main:
|
||||
_start:
|
||||
link.w %fp,#0
|
||||
move.l %a5,-(%sp)
|
||||
move.l #_GLOBAL_OFFSET_TABLE_@GOTPC, %a5
|
||||
lea (-6, %pc, %a5), %a5
|
||||
move.l x@TLSIE(%a5),%a0
|
||||
move.l -4(%fp),%a5
|
||||
unlk %fp
|
||||
rts
|
||||
.size main, .-main
|
||||
.section .note.GNU-stack,"",@progbits
|
Loading…
Reference in New Issue
Block a user