Fix x86-64 ILP32 shared library.

bfd/

2011-01-13  H.J. Lu  <hongjiu.lu@intel.com>

	* elf64-x86-64.c (elf_x86_64_link_hash_table): Remove
	swap_reloca_out.
	(elf_x86_64_link_hash_table_create): Don't set swap_reloca_out.
	(elf_x86_64_check_relocs): Align relocation section to 4 byte
	for 32bit.
	(elf_x86_64_gc_sweep_hook): Replace ELF64_ST_TYPE with
	ELF_ST_TYPE.
	(elf_x86_64_finish_dynamic_symbol): Updated.
	(elf_x86_64_finish_dynamic_sections): Don't use
	Elf64_External_Dyn, bfd_elf64_swap_dyn_in, nor
	bfd_elf64_swap_dyn_out.

ld/testsuite/

2011-01-13  H.J. Lu  <hongjiu.lu@intel.com>

	* ld-x86-64/ilp32-4.d: New.

	* ld-x86-64/x86-64.exp: Run ilp32-4.
This commit is contained in:
H.J. Lu 2011-01-14 04:24:00 +00:00
parent 175b7cd42c
commit 82e96e07e5
5 changed files with 71 additions and 12 deletions

View File

@ -1,3 +1,17 @@
2011-01-13 H.J. Lu <hongjiu.lu@intel.com>
* elf64-x86-64.c (elf_x86_64_link_hash_table): Remove
swap_reloca_out.
(elf_x86_64_link_hash_table_create): Don't set swap_reloca_out.
(elf_x86_64_check_relocs): Align relocation section to 4 byte
for 32bit.
(elf_x86_64_gc_sweep_hook): Replace ELF64_ST_TYPE with
ELF_ST_TYPE.
(elf_x86_64_finish_dynamic_symbol): Updated.
(elf_x86_64_finish_dynamic_sections): Don't use
Elf64_External_Dyn, bfd_elf64_swap_dyn_in, nor
bfd_elf64_swap_dyn_out.
2011-01-14 J. Park <grassman@gmail.com>
PR ld/12339

View File

@ -495,7 +495,6 @@ struct elf_x86_64_link_hash_table
bfd_vma (*r_info) (bfd_vma, bfd_vma);
bfd_vma (*r_sym) (bfd_vma);
void (*swap_reloca_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
const char *dynamic_interpreter;
int dynamic_interpreter_size;
@ -659,7 +658,6 @@ elf_x86_64_link_hash_table_create (bfd *abfd)
{
ret->r_info = elf64_r_info;
ret->r_sym = elf64_r_sym;
ret->swap_reloca_out = bfd_elf64_swap_reloca_out;
ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
ret->dynamic_interpreter_size = sizeof ELF64_DYNAMIC_INTERPRETER;
}
@ -667,7 +665,6 @@ elf_x86_64_link_hash_table_create (bfd *abfd)
{
ret->r_info = elf32_r_info;
ret->r_sym = elf32_r_sym;
ret->swap_reloca_out = bfd_elf32_swap_reloca_out;
ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
ret->dynamic_interpreter_size = sizeof ELF32_DYNAMIC_INTERPRETER;
}
@ -1545,7 +1542,8 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
htab->elf.dynobj = abfd;
sreloc = _bfd_elf_make_dynamic_reloc_section
(sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
(sec, htab->elf.dynobj, ABI_64_P (abfd) ? 3 : 2,
abfd, /*rela?*/ TRUE);
if (sreloc == NULL)
return FALSE;
@ -1699,7 +1697,7 @@ elf_x86_64_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
/* Check relocation against local STT_GNU_IFUNC symbol. */
if (isym != NULL
&& ELF64_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
&& ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
{
h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
if (h == NULL)
@ -3945,7 +3943,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
bed = get_elf_backend_data (output_bfd);
loc = relplt->contents + plt_index * bed->s->sizeof_rela;
htab->swap_reloca_out (output_bfd, &rela, loc);
bed->s->swap_reloca_out (output_bfd, &rela, loc);
if (!h->def_regular)
{
@ -4116,19 +4114,23 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
if (htab->elf.dynamic_sections_created)
{
Elf64_External_Dyn *dyncon, *dynconend;
bfd_byte *dyncon, *dynconend;
const struct elf_backend_data *bed;
bfd_size_type sizeof_dyn;
if (sdyn == NULL || htab->elf.sgot == NULL)
abort ();
dyncon = (Elf64_External_Dyn *) sdyn->contents;
dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
for (; dyncon < dynconend; dyncon++)
bed = get_elf_backend_data (dynobj);
sizeof_dyn = bed->s->sizeof_dyn;
dyncon = sdyn->contents;
dynconend = sdyn->contents + sdyn->size;
for (; dyncon < dynconend; dyncon += sizeof_dyn)
{
Elf_Internal_Dyn dyn;
asection *s;
bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
(*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
switch (dyn.d_tag)
{
@ -4177,7 +4179,7 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
break;
}
bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
(*bed->s->swap_dyn_out) (output_bfd, &dyn, dyncon);
}
/* Fill in the special first entry in the procedure linkage table. */

View File

@ -1,3 +1,9 @@
2011-01-13 H.J. Lu <hongjiu.lu@intel.com>
* ld-x86-64/ilp32-4.d: New.
* ld-x86-64/x86-64.exp: Run ilp32-4.
2011-01-13 H.J. Lu <hongjiu.lu@intel.com>
PR ld/12356

View File

@ -0,0 +1,36 @@
#source: start.s
#as: --n32
#ld: -m elf32_x86_64 -shared
#readelf: -d -S --wide
There are 10 section headers, starting at offset 0x22c:
Section Headers:
\[Nr\] Name Type Addr Off Size ES Flg Lk Inf Al
\[ 0\] NULL 00000000 000000 000000 00 0 0 0
\[ 1\] .hash HASH 00000094 000094 000030 04 A 2 0 4
\[ 2\] .dynsym DYNSYM 000000c4 0000c4 000070 10 A 3 2 4
\[ 3\] .dynstr STRTAB 00000134 000134 00001d 00 A 0 0 1
\[ 4\] .rela.dyn RELA 00000154 000154 00000c 0c A 2 0 4
\[ 5\] .text PROGBITS 00000160 000160 000005 00 AX 0 0 4
\[ 6\] .dynamic DYNAMIC 00200168 000168 000078 08 WA 3 0 4
\[ 7\] .shstrtab STRTAB 00000000 0001e0 00004a 00 0 0 1
\[ 8\] .symtab SYMTAB 00000000 0003bc 0000f0 10 9 10 4
\[ 9\] .strtab STRTAB 00000000 0004ac 00005d 00 0 0 1
Key to Flags:
W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\), l \(large\)
I \(info\), L \(link order\), G \(group\), T \(TLS\), E \(exclude\), x \(unknown\)
O \(extra OS processing required\) o \(OS specific\), p \(processor specific\)
Dynamic section at offset 0x168 contains 10 entries:
Tag Type Name/Value
0x00000004 \(HASH\) 0x94
0x00000005 \(STRTAB\) 0x134
0x00000006 \(SYMTAB\) 0xc4
0x0000000a \(STRSZ\) 29 \(bytes\)
0x0000000b \(SYMENT\) 16 \(bytes\)
0x00000007 \(RELA\) 0x154
0x00000008 \(RELASZ\) 12 \(bytes\)
0x00000009 \(RELAENT\) 12 \(bytes\)
0x00000016 \(TEXTREL\) 0x0
0x00000000 \(NULL\) 0x0

View File

@ -175,6 +175,7 @@ run_dump_test "compressed1"
run_dump_test "ilp32-1"
run_dump_test "ilp32-2"
run_dump_test "ilp32-3"
run_dump_test "ilp32-4"
run_dump_test "ia32-1"
run_dump_test "ia32-2"
run_dump_test "ia32-3"