Fix x86-64 ILP32 shared library.
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 14 Jan 2011 04:24:00 +0000 (04:24 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 14 Jan 2011 04:24:00 +0000 (04:24 +0000)
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.

bfd/ChangeLog
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-x86-64/ilp32-4.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 9a7433203bfe4844f9cc235d70ced7c87f1d14b7..326b326d613fb9e042d5c92bbc032123a29bb595 100644 (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
index ceb1a0a19a3949827396ea00a62ce83e610328f1..6066330f4c0f2148d45c3767de539cc45dd26703 100644 (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.  */
index 94c35e386617b798ac5b5689c9d303a761f4d356..02c0c343276d09cd6c3b5dff2e803095078e8a65 100644 (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
diff --git a/ld/testsuite/ld-x86-64/ilp32-4.d b/ld/testsuite/ld-x86-64/ilp32-4.d
new file mode 100644 (file)
index 0000000..24fe4c5
--- /dev/null
@@ -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
index 8e83ca804598bc3dccb0e3f3addf2afdb13212e9..3aec797619ac466237ad7ab295e0946023410717 100644 (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"