From ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 27 Sep 2001 16:10:28 +0000 Subject: [PATCH] * elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry without a reloc when symbol visibilty makes a function local. --- bfd/ChangeLog | 5 ++++ bfd/elf32-i386.c | 63 ++++++++++++++++++++++++++---------------------- 2 files changed, 39 insertions(+), 29 deletions(-) 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 { -- 2.30.2