This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Fix ILP32 shared library


Hi,

I checked in this patch to fix ILP32 shared library.


H.J.
---
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.

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.  */
diff --git a/ld/testsuite/ld-x86-64/ilp32-4.d b/ld/testsuite/ld-x86-64/ilp32-4.d
new file mode 100644
index 0000000..24fe4c5
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/ilp32-4.d
@@ -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
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index 8e83ca8..3aec797 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -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"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]