From: Alan Modra Date: Thu, 27 Sep 2001 16:10:28 +0000 (+0000) Subject: * elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry X-Git-Tag: cygnus_cvs_20020108_pre~1242 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf;p=thirdparty%2Fbinutils-gdb.git * elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry without a reloc when symbol visibilty makes a function local. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3b190962775..856930169ea 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2001-09-28 Alan Modra + + * elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry + without a reloc when symbol visibilty makes a function local. + 2001-09-27 Nick Clifton * elf32-arm.h (elf32_arm_merge_private_bfd_data): Fix detection of diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 019a2d06716..4cfd0faf72f 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -1263,47 +1263,52 @@ allocate_dynrelocs (h, inf) return false; } - s = htab->splt; - if (s == NULL) - abort (); + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h)) + { + s = htab->splt; + if (s == NULL) + abort (); - /* If this is the first .plt entry, make room for the special - first entry. */ - if (s->_raw_size == 0) - s->_raw_size += PLT_ENTRY_SIZE; + /* If this is the first .plt entry, make room for the special + first entry. */ + if (s->_raw_size == 0) + s->_raw_size += PLT_ENTRY_SIZE; - h->plt.offset = s->_raw_size; + h->plt.offset = s->_raw_size; - /* If this symbol is not defined in a regular file, and we are - not generating a shared library, then set the symbol to this - location in the .plt. This is required to make function - pointers compare as equal between the normal executable and - the shared library. */ - if (! info->shared - && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) - { - h->root.u.def.section = s; - h->root.u.def.value = h->plt.offset; - } + /* If this symbol is not defined in a regular file, and we are + not generating a shared library, then set the symbol to this + location in the .plt. This is required to make function + pointers compare as equal between the normal executable and + the shared library. */ + if (! info->shared + && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) + { + h->root.u.def.section = s; + h->root.u.def.value = h->plt.offset; + } - /* Make room for this entry. */ - s->_raw_size += PLT_ENTRY_SIZE; + /* Make room for this entry. */ + s->_raw_size += PLT_ENTRY_SIZE; - /* We also need to make an entry in the .got.plt section, which - will be placed in the .got section by the linker script. */ - s = htab->sgotplt; - if (s == NULL) - abort (); - s->_raw_size += 4; + /* We also need to make an entry in the .got.plt section, which + will be placed in the .got section by the linker script. */ + s = htab->sgotplt; + if (s == NULL) + abort (); + s->_raw_size += 4; - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h)) - { /* We also need to make an entry in the .rel.plt section. */ s = htab->srelplt; if (s == NULL) abort (); s->_raw_size += sizeof (Elf32_External_Rel); } + else + { + h->plt.offset = (bfd_vma) -1; + h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; + } } else {