aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf64-x86-64.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2011-01-14 04:24:00 +0000
committerH.J. Lu <hjl.tools@gmail.com>2011-01-14 04:24:00 +0000
commit82e96e07e5c45073273535cfe3ca665091199033 (patch)
tree29fdac6e6ad7108f9ba058555e9faecf0ac4391a /bfd/elf64-x86-64.c
parent175b7cd42c9adacf6fd3d4c70248c237647fa4fd (diff)
downloadgdb-82e96e07e5c45073273535cfe3ca665091199033.zip
gdb-82e96e07e5c45073273535cfe3ca665091199033.tar.gz
gdb-82e96e07e5c45073273535cfe3ca665091199033.tar.bz2
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.
Diffstat (limited to 'bfd/elf64-x86-64.c')
-rw-r--r--bfd/elf64-x86-64.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index ceb1a0a..6066330 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -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. */