diff options
author | Alan Modra <amodra@bigpond.net.au> | 2001-09-27 16:10:28 +0000 |
---|---|---|
committer | Alan Modra <amodra@bigpond.net.au> | 2001-09-27 16:10:28 +0000 |
commit | 1276a0bb009876217754fe34b4d5ec846abf180f (patch) | |
tree | 33c64c2764ba3506ba0210bc23db2b7b8db18ea0 /bfd/elf32-i386.c | |
parent | 6305676be9b0e02b9dbb0637247aa5efb9322d79 (diff) | |
download | gdb-1276a0bb009876217754fe34b4d5ec846abf180f.tar.gz |
* elf32-i386.c (allocate_dynrelocs): Don't create a .plt entry
without a reloc when symbol visibilty makes a function local.
Diffstat (limited to 'bfd/elf32-i386.c')
-rw-r--r-- | bfd/elf32-i386.c | 63 |
1 files changed, 34 insertions, 29 deletions
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 { |