PATCH: Move some STT_GNU_IFUNC support to generic ELF linker
H.J. Lu
hjl.tools@gmail.com
Wed Jun 17 18:20:00 GMT 2009
On Tue, Jun 16, 2009 at 6:06 PM, Alan Modra<amodra@bigpond.net.au> wrote:
> On Tue, Jun 16, 2009 at 10:26:09AM -0700, H.J. Lu wrote:
>> I don't have access to those hardwares. I can only test
>> with a cross linker. Please let me know if I should go
>> ahead to make those changes.
>
> Please do so. As it stands, you have broken all of those targets.
>
I checked in this patch to use existing .rela.got section.
Thanks.
--
H.J.
----
2009-06-17 H.J. Lu <hongjiu.lu@intel.com>
* elf32-arm.c (create_got_section): Get existing .rela.got
section.
* elf32-hppa.c (elf32_hppa_create_dynamic_sections): Likewise.
* elf32-lm32.c (create_got_section): Likewise.
* elf32-m32r.c (create_got_section): Likewise.
* elf32-ppc.c (ppc_elf_create_got): Likewise.
* elf32-s390.c (create_got_section): Likewise.
* elf32-sh.c (create_got_section): Likewise.
* elf32-xtensa.c (elf_xtensa_create_dynamic_sections): Likewise.
* elf64-s390.c (create_got_section): Likewise.
* elfxx-sparc.c (create_got_section): Likewise.
* elflink.c (_bfd_elf_create_got_section): Properly initialize
the GOT size.
-------------- next part --------------
2009-06-17 H.J. Lu <hongjiu.lu@intel.com>
* elf32-arm.c (create_got_section): Get existing .rela.got
section.
* elf32-hppa.c (elf32_hppa_create_dynamic_sections): Likewise.
* elf32-lm32.c (create_got_section): Likewise.
* elf32-m32r.c (create_got_section): Likewise.
* elf32-ppc.c (ppc_elf_create_got): Likewise.
* elf32-s390.c (create_got_section): Likewise.
* elf32-sh.c (create_got_section): Likewise.
* elf32-xtensa.c (elf_xtensa_create_dynamic_sections): Likewise.
* elf64-s390.c (create_got_section): Likewise.
* elfxx-sparc.c (create_got_section): Likewise.
* elflink.c (_bfd_elf_create_got_section): Properly initialize
the GOT size.
Index: elf32-lm32.c
===================================================================
--- elf32-lm32.c (revision 6160)
+++ elf32-lm32.c (working copy)
@@ -225,20 +225,10 @@ create_got_section (bfd *dynobj, struct
htab = lm32_elf_hash_table (info);
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
- if (! htab->sgot || ! htab->sgotplt)
+ htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
abort ();
- htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
- (SEC_ALLOC
- | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY));
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
- return FALSE;
-
return TRUE;
}
Index: elf32-ppc.c
===================================================================
--- elf32-ppc.c (revision 6160)
+++ elf32-ppc.c (working copy)
@@ -2845,12 +2845,9 @@ ppc_elf_create_got (bfd *abfd, struct bf
return FALSE;
}
- flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
- | SEC_LINKER_CREATED | SEC_READONLY);
- htab->relgot = bfd_make_section_with_flags (abfd, ".rela.got", flags);
- if (!htab->relgot
- || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
- return FALSE;
+ htab->relgot = bfd_get_section_by_name (abfd, ".rela.got");
+ if (!htab->relgot)
+ abort ();
return TRUE;
}
Index: elf32-hppa.c
===================================================================
--- elf32-hppa.c (revision 6160)
+++ elf32-hppa.c (working copy)
@@ -1011,16 +1011,7 @@ elf32_hppa_create_dynamic_sections (bfd
htab->srelplt = bfd_get_section_by_name (abfd, ".rela.plt");
htab->sgot = bfd_get_section_by_name (abfd, ".got");
- htab->srelgot = bfd_make_section_with_flags (abfd, ".rela.got",
- (SEC_ALLOC
- | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY));
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (abfd, htab->srelgot, 2))
- return FALSE;
+ htab->srelgot = bfd_get_section_by_name (abfd, ".rela.got");
htab->sdynbss = bfd_get_section_by_name (abfd, ".dynbss");
htab->srelbss = bfd_get_section_by_name (abfd, ".rela.bss");
Index: elfxx-sparc.c
===================================================================
--- elfxx-sparc.c (revision 6160)
+++ elfxx-sparc.c (working copy)
@@ -899,13 +899,7 @@ create_got_section (bfd *dynobj, struct
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
BFD_ASSERT (htab->sgot != NULL);
- htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
- SEC_ALLOC
- | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY);
+ htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
if (htab->srelgot == NULL
|| ! bfd_set_section_alignment (dynobj, htab->srelgot,
htab->word_align_power))
Index: elf32-sh.c
===================================================================
--- elf32-sh.c (revision 6160)
+++ elf32-sh.c (working copy)
@@ -2303,18 +2303,9 @@ create_got_section (bfd *dynobj, struct
htab = sh_elf_hash_table (info);
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
- if (! htab->sgot || ! htab->sgotplt)
+ htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
abort ();
-
- htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
- (SEC_ALLOC | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY));
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
- return FALSE;
return TRUE;
}
Index: elf32-s390.c
===================================================================
--- elf32-s390.c (revision 6160)
+++ elf32-s390.c (working copy)
@@ -821,18 +821,10 @@ create_got_section (dynobj, info)
htab = elf_s390_hash_table (info);
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
- if (!htab->sgot || !htab->sgotplt)
+ htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ if (!htab->sgot || !htab->sgotplt || !htab->srelgot)
abort ();
- htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
- (SEC_ALLOC | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY));
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
- return FALSE;
return TRUE;
}
Index: elflink.c
===================================================================
--- elflink.c (revision 6160)
+++ elflink.c (working copy)
@@ -110,12 +110,6 @@ _bfd_elf_create_got_section (bfd *abfd,
flags = bed->dynamic_sec_flags;
- s = bfd_make_section_with_flags (abfd, ".got", flags);
- if (s == NULL
- || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
- return FALSE;
- htab->sgot = s;
-
s = bfd_make_section_with_flags (abfd,
(bed->rela_plts_and_copies_p
? ".rela.got" : ".rel.got"),
@@ -126,6 +120,12 @@ _bfd_elf_create_got_section (bfd *abfd,
return FALSE;
htab->srelgot = s;
+ s = bfd_make_section_with_flags (abfd, ".got", flags);
+ if (s == NULL
+ || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
+ return FALSE;
+ htab->sgot = s;
+
if (bed->want_got_plt)
{
s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
@@ -136,6 +136,9 @@ _bfd_elf_create_got_section (bfd *abfd,
htab->sgotplt = s;
}
+ /* The first bit of the global offset table is the header. */
+ s->size += bed->got_header_size;
+
if (bed->want_got_sym)
{
/* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
@@ -149,9 +152,6 @@ _bfd_elf_create_got_section (bfd *abfd,
return FALSE;
}
- /* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
-
return TRUE;
}
Index: elf32-m32r.c
===================================================================
--- elf32-m32r.c (revision 6160)
+++ elf32-m32r.c (working copy)
@@ -1623,20 +1623,10 @@ create_got_section (bfd *dynobj, struct
htab = m32r_elf_hash_table (info);
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
- if (! htab->sgot || ! htab->sgotplt)
+ htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ if (! htab->sgot || ! htab->sgotplt || ! htab->srelgot)
abort ();
- htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
- (SEC_ALLOC
- | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY));
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
- return FALSE;
-
return TRUE;
}
Index: elf32-xtensa.c
===================================================================
--- elf32-xtensa.c (revision 6160)
+++ elf32-xtensa.c (working copy)
@@ -1404,6 +1404,7 @@ elf_xtensa_create_dynamic_sections (bfd
htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
+ htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
/* Create any extra PLT sections in case check_relocs has already
been called on all the non-dynamic input files. */
@@ -1419,12 +1420,6 @@ elf_xtensa_create_dynamic_sections (bfd
|| ! bfd_set_section_flags (dynobj, htab->sgotplt, flags))
return FALSE;
- /* Create ".rela.got". */
- htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got", flags);
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
- return FALSE;
-
/* Create ".got.loc" (literal tables for use by dynamic linker). */
htab->sgotloc = bfd_make_section_with_flags (dynobj, ".got.loc", flags);
if (htab->sgotloc == NULL
Index: elf64-s390.c
===================================================================
--- elf64-s390.c (revision 6160)
+++ elf64-s390.c (working copy)
@@ -776,18 +776,9 @@ create_got_section (dynobj, info)
htab = elf_s390_hash_table (info);
htab->sgot = bfd_get_section_by_name (dynobj, ".got");
htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
- if (!htab->sgot || !htab->sgotplt)
+ htab->srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
+ if (!htab->sgot || !htab->sgotplt || !htab->srelgot)
abort ();
-
- htab->srelgot = bfd_make_section_with_flags (dynobj, ".rela.got",
- (SEC_ALLOC | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY));
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
- return FALSE;
return TRUE;
}
Index: elf32-arm.c
===================================================================
--- elf32-arm.c (revision 6160)
+++ elf32-arm.c (working copy)
@@ -2748,15 +2748,9 @@ create_got_section (bfd *dynobj, struct
if (!htab->sgot || !htab->sgotplt)
abort ();
- htab->srelgot = bfd_make_section_with_flags (dynobj,
- RELOC_SECTION (htab, ".got"),
- (SEC_ALLOC | SEC_LOAD
- | SEC_HAS_CONTENTS
- | SEC_IN_MEMORY
- | SEC_LINKER_CREATED
- | SEC_READONLY));
- if (htab->srelgot == NULL
- || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2))
+ htab->srelgot = bfd_get_section_by_name (dynobj,
+ RELOC_SECTION (htab, ".got"));
+ if (htab->srelgot == NULL)
return FALSE;
return TRUE;
}
More information about the Binutils
mailing list