Don't resolve size relocation against non-zero TLS symbol

bfd/

	* elf32-i386.c (elf_i386_allocate_dynrelocs): Don't clear pc_count
	for non-zero TLS symbol.
	(elf_i386_relocate_section): Don't resolve size relocation against
	non-zero TLS symbol.
	* elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Don't clear
	pc_count for non-zero TLS symbol.
	(elf_x86_64_relocate_section): Don't resolve size relocation
	against non-zero TLS symbol.

ld/testsuite/

	* ld-size/size-10.rd: Updated.
	* ld-size/size-8.rd: Likewise.
	* ld-size/size32-2-i386.d: Likewise.
	* ld-size/size32-2-x32.d: Likewise.
	* ld-size/size32-2-x86-64.d: Likewise.
	* ld-size/size64-2-x32.d: Likewise.
	* ld-size/size64-2-x86-64.d: Likewise.

	* ld-size/size.exp (run_time_tests): Pass --hash-styl=gnu to
	linker for size-8 test.
This commit is contained in:
H.J. Lu 2013-02-07 02:15:30 +00:00
parent 5605a9468a
commit 20e52bd2b8
12 changed files with 68 additions and 84 deletions

View File

@ -1,5 +1,16 @@
2013-02-06 H.J. Lu <hongjiu.lu@intel.com>
* elf32-i386.c (elf_i386_allocate_dynrelocs): Don't clear pc_count
for non-zero TLS symbol.
(elf_i386_relocate_section): Don't resolve size relocation against
non-zero TLS symbol.
* elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Don't clear
pc_count for non-zero TLS symbol.
(elf_x86_64_relocate_section): Don't resolve size relocation
against non-zero TLS symbol.
2013-02-06 Sandra Loosemore <sandra@codesourcery.com>
Andrew Jenner <andrew@codesourcery.com>
Andrew Jenner <andrew@codesourcery.com>
Based on patches from Altera Corporation.

View File

@ -2358,24 +2358,6 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
if (eh->dyn_relocs == NULL)
return TRUE;
/* Since pc_count for TLS symbol can only have size relocations and
we always resolve size relocation against non-zero TLS symbol, we
clear pc_count for non-zero TLS symbol. */
if (h->type == STT_TLS && h->size != 0)
{
struct elf_dyn_relocs **pp;
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
{
p->count -= p->pc_count;
p->pc_count = 0;
if (p->count == 0)
*pp = p->next;
else
pp = &p->next;
}
}
/* In the shared -Bsymbolic case, discard space allocated for
dynamic pc-relative relocs against symbols which turn out to be
defined in regular objects. For the normal shared case, discard
@ -3709,12 +3691,6 @@ elf_i386_relocate_section (bfd *output_bfd,
case R_386_SIZE32:
/* Set to symbol size. */
relocation = st_size;
if (h && h->type == STT_TLS && st_size != 0)
{
/* Resolve size relocation against non-zero TLS symbol. */
unresolved_reloc = FALSE;
break;
}
/* Fall through. */
case R_386_32:

View File

@ -2400,24 +2400,6 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
if (eh->dyn_relocs == NULL)
return TRUE;
/* Since pc_count for TLS symbol can only have size relocations and
we always resolve size relocation against non-zero TLS symbol, we
clear pc_count for non-zero TLS symbol. */
if (h->type == STT_TLS && h->size != 0)
{
struct elf_dyn_relocs **pp;
for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
{
p->count -= p->pc_count;
p->pc_count = 0;
if (p->count == 0)
*pp = p->next;
else
pp = &p->next;
}
}
/* In the shared -Bsymbolic case, discard space allocated for
dynamic pc-relative relocs against symbols which turn out to be
defined in regular objects. For the normal shared case, discard
@ -3705,12 +3687,6 @@ elf_x86_64_relocate_section (bfd *output_bfd,
case R_X86_64_SIZE64:
/* Set to symbol size. */
relocation = st_size;
if (h && h->type == STT_TLS && st_size != 0)
{
/* Resolve size relocation against non-zero TLS symbol. */
unresolved_reloc = FALSE;
break;
}
goto direct;
case R_X86_64_PC8:

View File

@ -1,5 +1,18 @@
2013-02-06 H.J. Lu <hongjiu.lu@intel.com>
* ld-size/size-10.rd: Updated.
* ld-size/size-8.rd: Likewise.
* ld-size/size32-2-i386.d: Likewise.
* ld-size/size32-2-x32.d: Likewise.
* ld-size/size32-2-x86-64.d: Likewise.
* ld-size/size64-2-x32.d: Likewise.
* ld-size/size64-2-x86-64.d: Likewise.
* ld-size/size.exp (run_time_tests): Pass --hash-styl=gnu to
linker for size-8 test.
2013-02-06 Sandra Loosemore <sandra@codesourcery.com>
Andrew Jenner <andrew@codesourcery.com>
Andrew Jenner <andrew@codesourcery.com>
Based on patches from Altera Corporation.

View File

@ -1,4 +1,3 @@
#failif
#...
.* +R_.*_NONE +.*
#...
[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.*
#pass

View File

@ -1,4 +1,3 @@
#failif
#...
.* +R_.*_NONE +.*
#...
[0-9a-f]+ +[0-9a-f]+ +R_.*_SIZE(32|64) +.*
#pass

View File

@ -156,7 +156,7 @@ if { [regexp_diff "tmpdir/dump.out" "$srcdir/$subdir/size-7.out" ] } then {
# Run-time size relocation tests.
set run_time_tests {
{"Run size-8"
"tmpdir/libsize-8.so" ""
"tmpdir/libsize-8.so --hash-styl=gnu" ""
{size-8a.c} "size-8" "size-8.out"}
{"Run size-9"
"tmpdir/libsize-9.so" ""

View File

@ -8,11 +8,13 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
0+1234 R_386_SIZE32 zzz
0+1238 R_386_SIZE32 zzz
0+123c R_386_SIZE32 zzz
0+123c R_386_SIZE32 xxx
0+1240 R_386_SIZE32 yyy
0+1244 R_386_SIZE32 zzz
0+1248 R_386_SIZE32 zzz
0+124c R_386_SIZE32 zzz
Contents of section .data:
122c 28000000 28000000 00000000 e2ffffff ................
123c 1e000000 ....
123c 00000000 00000000 00000000 e2ffffff ................
124c 1e000000 ....

View File

@ -8,11 +8,13 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
0+200268 R_X86_64_SIZE32 zzz
0+20026c R_X86_64_SIZE32 zzz-0x0000001e
0+200270 R_X86_64_SIZE32 zzz\+0x0000001e
0+200278 R_X86_64_SIZE32 xxx
0+20027c R_X86_64_SIZE32 yyy
0+200280 R_X86_64_SIZE32 zzz
0+200284 R_X86_64_SIZE32 zzz-0x0000001e
0+200288 R_X86_64_SIZE32 zzz\+0x0000001e
Contents of section .data:
200260 28000000 28000000 00000000 00000000 ................
200270 00000000 ....
200278 00000000 00000000 00000000 00000000 ................
200288 00000000 ....

View File

@ -8,11 +8,13 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
0+2003b0 R_X86_64_SIZE32 zzz
0+2003b4 R_X86_64_SIZE32 zzz-0x000000000000001e
0+2003b8 R_X86_64_SIZE32 zzz\+0x000000000000001e
0+2003d8 R_X86_64_SIZE32 xxx
0+2003dc R_X86_64_SIZE32 yyy
0+2003e0 R_X86_64_SIZE32 zzz
0+2003e4 R_X86_64_SIZE32 zzz-0x000000000000001e
0+2003e8 R_X86_64_SIZE32 zzz\+0x000000000000001e
Contents of section .data:
2003a8 28000000 28000000 00000000 00000000 ................
2003b8 00000000 ....
2003d8 00000000 00000000 00000000 00000000 ................
2003e8 00000000 ....

View File

@ -8,12 +8,14 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
0+200270 R_X86_64_SIZE32 zzz
0+200278 R_X86_64_SIZE64 zzz-0x0000001e
0+200280 R_X86_64_SIZE64 zzz\+0x0000001e
0+200278 R_X86_64_SIZE32 xxx
0+200280 R_X86_64_SIZE32 yyy
0+200288 R_X86_64_SIZE32 zzz
0+200290 R_X86_64_SIZE64 zzz-0x0000001e
0+200298 R_X86_64_SIZE64 zzz\+0x0000001e
Contents of section .data:
200260 28000000 00000000 28000000 00000000 ................
200270 00000000 00000000 00000000 00000000 ................
200280 00000000 00000000 ........
200278 00000000 00000000 00000000 00000000 ................
200288 00000000 00000000 00000000 00000000 ................
200298 00000000 00000000 ........

View File

@ -8,12 +8,14 @@
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
0+2003b8 R_X86_64_SIZE64 zzz
0+2003c0 R_X86_64_SIZE64 zzz-0x000000000000001e
0+2003c8 R_X86_64_SIZE64 zzz\+0x000000000000001e
0+2003d8 R_X86_64_SIZE64 xxx
0+2003e0 R_X86_64_SIZE64 yyy
0+2003e8 R_X86_64_SIZE64 zzz
0+2003f0 R_X86_64_SIZE64 zzz-0x000000000000001e
0+2003f8 R_X86_64_SIZE64 zzz\+0x000000000000001e
Contents of section .data:
2003a8 28000000 00000000 28000000 00000000 ................
2003b8 00000000 00000000 00000000 00000000 ................
2003c8 00000000 00000000 ........
2003d8 00000000 00000000 00000000 00000000 ................
2003e8 00000000 00000000 00000000 00000000 ................
2003f8 00000000 00000000 ........