mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
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:
@ -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>
|
2011-01-14 J. Park <grassman@gmail.com>
|
||||||
|
|
||||||
PR ld/12339
|
PR ld/12339
|
||||||
|
@ -495,7 +495,6 @@ struct elf_x86_64_link_hash_table
|
|||||||
|
|
||||||
bfd_vma (*r_info) (bfd_vma, bfd_vma);
|
bfd_vma (*r_info) (bfd_vma, bfd_vma);
|
||||||
bfd_vma (*r_sym) (bfd_vma);
|
bfd_vma (*r_sym) (bfd_vma);
|
||||||
void (*swap_reloca_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
|
|
||||||
const char *dynamic_interpreter;
|
const char *dynamic_interpreter;
|
||||||
int dynamic_interpreter_size;
|
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_info = elf64_r_info;
|
||||||
ret->r_sym = elf64_r_sym;
|
ret->r_sym = elf64_r_sym;
|
||||||
ret->swap_reloca_out = bfd_elf64_swap_reloca_out;
|
|
||||||
ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
|
ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
|
||||||
ret->dynamic_interpreter_size = sizeof 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_info = elf32_r_info;
|
||||||
ret->r_sym = elf32_r_sym;
|
ret->r_sym = elf32_r_sym;
|
||||||
ret->swap_reloca_out = bfd_elf32_swap_reloca_out;
|
|
||||||
ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
|
ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
|
||||||
ret->dynamic_interpreter_size = sizeof 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;
|
htab->elf.dynobj = abfd;
|
||||||
|
|
||||||
sreloc = _bfd_elf_make_dynamic_reloc_section
|
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)
|
if (sreloc == NULL)
|
||||||
return FALSE;
|
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. */
|
/* Check relocation against local STT_GNU_IFUNC symbol. */
|
||||||
if (isym != NULL
|
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);
|
h = elf_x86_64_get_local_sym_hash (htab, abfd, rel, FALSE);
|
||||||
if (h == NULL)
|
if (h == NULL)
|
||||||
@ -3945,7 +3943,7 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd,
|
|||||||
|
|
||||||
bed = get_elf_backend_data (output_bfd);
|
bed = get_elf_backend_data (output_bfd);
|
||||||
loc = relplt->contents + plt_index * bed->s->sizeof_rela;
|
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)
|
if (!h->def_regular)
|
||||||
{
|
{
|
||||||
@ -4116,19 +4114,23 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
|
|||||||
|
|
||||||
if (htab->elf.dynamic_sections_created)
|
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)
|
if (sdyn == NULL || htab->elf.sgot == NULL)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
dyncon = (Elf64_External_Dyn *) sdyn->contents;
|
bed = get_elf_backend_data (dynobj);
|
||||||
dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
|
sizeof_dyn = bed->s->sizeof_dyn;
|
||||||
for (; dyncon < dynconend; dyncon++)
|
dyncon = sdyn->contents;
|
||||||
|
dynconend = sdyn->contents + sdyn->size;
|
||||||
|
for (; dyncon < dynconend; dyncon += sizeof_dyn)
|
||||||
{
|
{
|
||||||
Elf_Internal_Dyn dyn;
|
Elf_Internal_Dyn dyn;
|
||||||
asection *s;
|
asection *s;
|
||||||
|
|
||||||
bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
|
(*bed->s->swap_dyn_in) (dynobj, dyncon, &dyn);
|
||||||
|
|
||||||
switch (dyn.d_tag)
|
switch (dyn.d_tag)
|
||||||
{
|
{
|
||||||
@ -4177,7 +4179,7 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
|
|||||||
break;
|
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. */
|
/* Fill in the special first entry in the procedure linkage table. */
|
||||||
|
@ -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>
|
2011-01-13 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR ld/12356
|
PR ld/12356
|
||||||
|
36
ld/testsuite/ld-x86-64/ilp32-4.d
Normal file
36
ld/testsuite/ld-x86-64/ilp32-4.d
Normal 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
|
@ -175,6 +175,7 @@ run_dump_test "compressed1"
|
|||||||
run_dump_test "ilp32-1"
|
run_dump_test "ilp32-1"
|
||||||
run_dump_test "ilp32-2"
|
run_dump_test "ilp32-2"
|
||||||
run_dump_test "ilp32-3"
|
run_dump_test "ilp32-3"
|
||||||
|
run_dump_test "ilp32-4"
|
||||||
run_dump_test "ia32-1"
|
run_dump_test "ia32-1"
|
||||||
run_dump_test "ia32-2"
|
run_dump_test "ia32-2"
|
||||||
run_dump_test "ia32-3"
|
run_dump_test "ia32-3"
|
||||||
|
Reference in New Issue
Block a user