diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 13 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 2 | ||||
-rw-r--r-- | bfd/elf-m10300.c | 41 | ||||
-rw-r--r-- | bfd/elf32-frv.c | 39 | ||||
-rw-r--r-- | bfd/elf64-alpha.c | 32 | ||||
-rw-r--r-- | bfd/elflink.c | 106 |
6 files changed, 88 insertions, 145 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 684d7f7..18afd0f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +2005-08-16 Alan Modra <amodra@bigpond.net.au> + + * elf-bfd.h (_bfd_elf_define_linkage_sym): Declare. + * elflink.c (_bfd_elf_define_linkage_sym): New function, extracted + from.. + (_bfd_elf_create_got_section): ..here. + (_bfd_elf_link_create_dynamic_sections): Call it for _DYNAMIC. + (_bfd_elf_create_dynamic_sections): ..and _PROCEDURE_LINKAGE_TABLE_. + * elf-m10300.c (_bfd_mn10300_elf_create_got_section): Use + _bfd_elf_define_linkage_sym. + * elf32-frv.c (_frv_create_got_section): Likewise. + * elf64-alpha.c (elf64_alpha_create_dynamic_sections): Likewise. + 2005-08-15 Paul Brook <paul@codesourcery.com> * elf32-arm.c (elf32_arm_howto_table_1): Make R_ARM_PLT32 the same as diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index e238a95..eae124a 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1639,6 +1639,8 @@ extern bfd_boolean _bfd_elf_create_dynamic_sections (bfd *, struct bfd_link_info *); extern bfd_boolean _bfd_elf_create_got_section (bfd *, struct bfd_link_info *); +extern struct elf_link_hash_entry *_bfd_elf_define_linkage_sym + (bfd *, struct bfd_link_info *, asection *, const char *); extern bfd_boolean _bfd_elfcore_make_pseudosection (bfd *, char *, size_t, ufile_ptr); diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c index 030af7e..b3f8044 100644 --- a/bfd/elf-m10300.c +++ b/bfd/elf-m10300.c @@ -542,7 +542,6 @@ _bfd_mn10300_elf_create_got_section (abfd, info) flagword flags; flagword pltflags; asection * s; - struct bfd_link_hash_entry * bh; struct elf_link_hash_entry * h; const struct elf_backend_data * bed = get_elf_backend_data (abfd); int ptralign; @@ -581,24 +580,12 @@ _bfd_mn10300_elf_create_got_section (abfd, info) || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) return FALSE; - if (bed->want_plt_sym) - { - /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the - .plt section. */ - bh = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, - (bfd_vma) 0, (const char *) NULL, FALSE, - get_elf_backend_data (abfd)->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - - if (info->shared - && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } + /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the + .plt section. */ + if (bed->want_plt_sym + && !_bfd_elf_define_linkage_sym (abfd, info, s, + "_PROCEDURE_LINKAGE_TABLE_")) + return FALSE; s = bfd_make_section_with_flags (abfd, ".got", flags); if (s == NULL @@ -617,20 +604,10 @@ _bfd_mn10300_elf_create_got_section (abfd, info) (or .got.plt) section. We don't do this in the linker script because we don't want to define the symbol if we are not creating a global offset table. */ - bh = NULL; - if (!(_bfd_generic_link_add_one_symbol - (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - 0, (const char *) NULL, FALSE, bed->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - - if (info->shared - && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - + h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_"); elf_hash_table (info)->hgot = h; + if (h == NULL) + return FALSE; /* The first bit of the global offset table is the header. */ s->size += bed->got_header_size; diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c index 5d60432..e839cd1 100644 --- a/bfd/elf32-frv.c +++ b/bfd/elf32-frv.c @@ -4301,22 +4301,15 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) (or .got.plt) section. We don't do this in the linker script because we don't want to define the symbol if we are not creating a global offset table. */ - bh = NULL; - if (!(_bfd_generic_link_add_one_symbol - (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - 0, (const char *) NULL, FALSE, bed->collect, &bh))) + h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_"); + elf_hash_table (info)->hgot = h; + if (h == NULL) return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - /* h->other = STV_HIDDEN; */ /* Should we? */ /* Machine-specific: we want the symbol for executables as well. */ if (! bfd_elf_link_record_dynamic_symbol (info, h)) return FALSE; - - elf_hash_table (info)->hgot = h; } /* The first bit of the global offset table is the header. */ @@ -4399,26 +4392,12 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) /* FRV-specific: remember it. */ frvfdpic_plt_section (info) = s; - if (bed->want_plt_sym) - { - /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the - .plt section. */ - struct elf_link_hash_entry *h; - struct bfd_link_hash_entry *bh = NULL; - - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL, - FALSE, get_elf_backend_data (abfd)->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - /* h->other = STV_HIDDEN; */ /* Should we? */ - - if (! info->executable - && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } + /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the + .plt section. */ + if (bed->want_plt_sym + && !_bfd_elf_define_linkage_sym (abfd, info, s, + "_PROCEDURE_LINKAGE_TABLE_")) + return FALSE; /* FRV-specific: we want rel relocations for the plt. */ s = bfd_make_section_with_flags (abfd, ".rel.plt", diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c index 2868a02..0472d7f 100644 --- a/bfd/elf64-alpha.c +++ b/bfd/elf64-alpha.c @@ -1232,7 +1232,6 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) asection *s; flagword flags; struct elf_link_hash_entry *h; - struct bfd_link_hash_entry *bh; /* We need to create .plt, .rela.plt, .got, and .rela.got sections. */ @@ -1245,17 +1244,8 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the .plt section. */ - bh = NULL; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, - (bfd_vma) 0, (const char *) NULL, FALSE, - get_elf_backend_data (abfd)->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - - if (info->shared && ! bfd_elf_link_record_dynamic_symbol (info, h)) + if (!_bfd_elf_define_linkage_sym (abfd, info, s, + "_PROCEDURE_LINKAGE_TABLE_")) return FALSE; flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY @@ -1292,21 +1282,11 @@ elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) dynobj's .got section. We don't do this in the linker script because we don't want to define the symbol if we are not creating a global offset table. */ - bh = NULL; - if (!(_bfd_generic_link_add_one_symbol - (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, - alpha_elf_tdata(abfd)->got, (bfd_vma) 0, (const char *) NULL, - FALSE, get_elf_backend_data (abfd)->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - - if (info->shared - && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - + h = _bfd_elf_define_linkage_sym (abfd, info, alpha_elf_tdata(abfd)->got, + "_GLOBAL_OFFSET_TABLE_"); elf_hash_table (info)->hgot = h; + if (h == NULL) + return FALSE; return TRUE; } diff --git a/bfd/elflink.c b/bfd/elflink.c index 7b7cddd..14096aa 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -27,13 +27,51 @@ #include "safe-ctype.h" #include "libiberty.h" +/* Define a symbol in a dynamic linkage section. */ + +struct elf_link_hash_entry * +_bfd_elf_define_linkage_sym (bfd *abfd, + struct bfd_link_info *info, + asection *sec, + const char *name) +{ + struct elf_link_hash_entry *h; + struct bfd_link_hash_entry *bh; + + h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE, FALSE); + if (h != NULL) + { + /* Zap symbol defined in an as-needed lib that wasn't linked. + This is a symptom of a larger problem: Absolute symbols + defined in shared libraries can't be overridden, because we + lose the link to the bfd which is via the symbol section. */ + h->root.type = bfd_link_hash_new; + } + + bh = &h->root; + if (!_bfd_generic_link_add_one_symbol (info, abfd, name, BSF_GLOBAL, + sec, 0, NULL, FALSE, + get_elf_backend_data (abfd)->collect, + &bh)) + return NULL; + h = (struct elf_link_hash_entry *) bh; + h->def_regular = 1; + h->type = STT_OBJECT; + h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN; + + if (!info->executable + && !bfd_elf_link_record_dynamic_symbol (info, h)) + return NULL; + + return h; +} + bfd_boolean _bfd_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) { flagword flags; asection *s; struct elf_link_hash_entry *h; - struct bfd_link_hash_entry *bh; const struct elf_backend_data *bed = get_elf_backend_data (abfd); int ptralign; @@ -78,21 +116,10 @@ _bfd_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) (or .got.plt) section. We don't do this in the linker script because we don't want to define the symbol if we are not creating a global offset table. */ - bh = NULL; - if (!(_bfd_generic_link_add_one_symbol - (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - 0, NULL, FALSE, bed->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - h->other = STV_HIDDEN; - - if (! info->executable - && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - + h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_"); elf_hash_table (info)->hgot = h; + if (h == NULL) + return FALSE; } /* The first bit of the global offset table is the header. */ @@ -132,8 +159,6 @@ _bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) { flagword flags; register asection *s; - struct elf_link_hash_entry *h; - struct bfd_link_hash_entry *bh; const struct elf_backend_data *bed; if (! is_elf_hash_table (info->hash)) @@ -212,27 +237,7 @@ _bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) section. We don't want to define it if there is no .dynamic section, since on some ELF platforms the start up code examines it to decide how to initialize the process. */ - h = elf_link_hash_lookup (elf_hash_table (info), "_DYNAMIC", - FALSE, FALSE, FALSE); - if (h != NULL) - { - /* Zap symbol defined in an as-needed lib that wasn't linked. - This is a symptom of a larger problem: Absolute symbols - defined in shared libraries can't be overridden, because we - lose the link to the bfd which is via the symbol section. */ - h->root.type = bfd_link_hash_new; - } - bh = &h->root; - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_DYNAMIC", BSF_GLOBAL, s, 0, NULL, FALSE, - get_elf_backend_data (abfd)->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - - if (! info->executable - && ! bfd_elf_link_record_dynamic_symbol (info, h)) + if (!_bfd_elf_define_linkage_sym (abfd, info, s, "_DYNAMIC")) return FALSE; s = bfd_make_section_with_flags (abfd, ".hash", @@ -282,25 +287,12 @@ _bfd_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) return FALSE; - if (bed->want_plt_sym) - { - /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the - .plt section. */ - struct elf_link_hash_entry *h; - struct bfd_link_hash_entry *bh = NULL; - - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL, - FALSE, get_elf_backend_data (abfd)->collect, &bh))) - return FALSE; - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - - if (! info->executable - && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } + /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the + .plt section. */ + if (bed->want_plt_sym + && !_bfd_elf_define_linkage_sym (abfd, info, s, + "_PROCEDURE_LINKAGE_TABLE_")) + return FALSE; s = bfd_make_section_with_flags (abfd, (bed->default_use_rela_p |