+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
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;
{
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;
}
{
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;
}
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;
/* 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)
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)
{
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)
{
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. */
--- /dev/null
+#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