From 2517a57fdf395c6e5068577d1d4f86b3c6935e6d Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 8 Aug 2001 13:09:33 +0000 Subject: [PATCH] * elf-bfd.h (struct elf_backend_data): Add want_got_sym. * elfxx-target.h (elf_backend_want_got_sym): Define. (elfNN_bed): Add elf_backend_want_got_sym. * elflink.c (_bfd_elf_create_got_section): Define _GLOBAL_OFFSET_TABLE_ only if bed->want_got_sym. --- bfd/ChangeLog | 9 +++++++++ bfd/elf-bfd.h | 1 + bfd/elflink.c | 35 +++++++++++++++++++---------------- bfd/elfxx-target.h | 6 +++++- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9429b02..c487e46 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2001-08-08 Alan Modra + + 1999-10-19 Linus Nordberg + * elf-bfd.h (struct elf_backend_data): Add want_got_sym. + * elfxx-target.h (elf_backend_want_got_sym): Define. + (elfNN_bed): Add elf_backend_want_got_sym. + * elflink.c (_bfd_elf_create_got_section): Define + _GLOBAL_OFFSET_TABLE_ only if bed->want_got_sym. + 2001-08-08 Alexandre Oliva * dwarf2.c (struct dwarf2_debug): Add sec, sec_info_ptr and syms. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 85e1e30..7c67cb5 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -694,6 +694,7 @@ struct elf_backend_data unsigned plt_not_loaded : 1; unsigned plt_alignment : 4; unsigned can_gc_sections : 1; + unsigned want_got_sym : 1; unsigned want_dynbss : 1; }; diff --git a/bfd/elflink.c b/bfd/elflink.c index b971311..f06a49b 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -73,24 +73,27 @@ _bfd_elf_create_got_section (abfd, info) return false; } - /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got - (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. */ - h = NULL; - if (!(_bfd_generic_link_add_one_symbol - (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, - bed->got_symbol_offset, (const char *) NULL, false, - bed->collect, (struct bfd_link_hash_entry **) &h))) - return false; - h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; - h->type = STT_OBJECT; + if (bed->want_got_sym) + { + /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got + (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. */ + h = NULL; + if (!(_bfd_generic_link_add_one_symbol + (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL, s, + bed->got_symbol_offset, (const char *) NULL, false, + bed->collect, (struct bfd_link_hash_entry **) &h))) + return false; + h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR; + h->type = STT_OBJECT; - if (info->shared - && ! _bfd_elf_link_record_dynamic_symbol (info, h)) - return false; + if (info->shared + && ! _bfd_elf_link_record_dynamic_symbol (info, h)) + return false; - elf_hash_table (info)->hgot = h; + elf_hash_table (info)->hgot = h; + } /* The first bit of the global offset table is the header. */ s->_raw_size += bed->got_header_size + bed->got_symbol_offset; diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 5f413d2..2b86aac 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -101,6 +101,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef elf_backend_can_gc_sections #define elf_backend_can_gc_sections 0 #endif +#ifndef elf_backend_want_got_sym +#define elf_backend_want_got_sym 1 +#endif #ifndef elf_backend_gc_mark_hook #define elf_backend_gc_mark_hook NULL #endif @@ -439,7 +442,8 @@ static CONST struct elf_backend_data elfNN_bed = elf_backend_plt_not_loaded, elf_backend_plt_alignment, elf_backend_can_gc_sections, - elf_backend_want_dynbss + elf_backend_want_dynbss, + elf_backend_want_got_sym }; #endif -- 2.7.4