From 729b010560ef364fd147584be4ee57d5f2319cfc Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 17 Jun 2009 18:08:34 +0000 Subject: [PATCH] 2009-06-17 H.J. Lu * 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. --- bfd/ChangeLog | 17 +++++++++++++++++ bfd/elf32-arm.c | 12 +++--------- bfd/elf32-hppa.c | 11 +---------- bfd/elf32-lm32.c | 14 ++------------ bfd/elf32-m32r.c | 14 ++------------ bfd/elf32-ppc.c | 9 +++------ bfd/elf32-s390.c | 12 ++---------- bfd/elf32-sh.c | 13 ++----------- bfd/elf32-xtensa.c | 7 +------ bfd/elf64-s390.c | 13 ++----------- bfd/elflink.c | 18 +++++++++--------- bfd/elfxx-sparc.c | 8 +------- 12 files changed, 45 insertions(+), 103 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ad5fd4f024..15e73e9fb2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,20 @@ +2009-06-17 H.J. Lu + + * 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. + 2009-06-16 H.J. Lu * elf-bfd.h (ELF_LOCAL_SYMBOL_HASH): New. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index e1f569b64f..45a94c7015 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -2748,15 +2748,9 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) 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; } diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index a83c4fd9ce..20be2e7952 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -1011,16 +1011,7 @@ elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) 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"); diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c index 620dc506d1..bad0a7b949 100644 --- a/bfd/elf32-lm32.c +++ b/bfd/elf32-lm32.c @@ -225,20 +225,10 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) 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; } diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c index 96db6cbdff..fd67e057d7 100644 --- a/bfd/elf32-m32r.c +++ b/bfd/elf32-m32r.c @@ -1623,20 +1623,10 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) 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; } diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index dcf33cc3da..c7ac2a134d 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -2845,12 +2845,9 @@ ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info) 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; } diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 14c4cb0c99..531f9e6a85 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -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; } diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index 89cef67769..555d900f64 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -2303,18 +2303,9 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) 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; } diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index 09e81ad82e..4200f6fbdb 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -1404,6 +1404,7 @@ elf_xtensa_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) 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 *dynobj, struct bfd_link_info *info) || ! 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 diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index 21a58649d9..c9bd764a44 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -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; } diff --git a/bfd/elflink.c b/bfd/elflink.c index f1bceaed6b..70bca46953 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -110,12 +110,6 @@ _bfd_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) 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, struct bfd_link_info *info) 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, struct bfd_link_info *info) 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, struct bfd_link_info *info) return FALSE; } - /* The first bit of the global offset table is the header. */ - s->size += bed->got_header_size; - return TRUE; } diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index 9acdfc4d3c..9ec46179be 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -899,13 +899,7 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) 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)) -- 2.11.0