diff options
author | Alan Modra <amodra@gmail.com> | 2001-09-27 16:10:28 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2001-09-27 16:10:28 +0000 |
commit | ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf (patch) | |
tree | 34fb2fc4cfe68bc951d3c77d01156f2ca67b9afb /bfd/elf32-i386.c | |
parent | 06317a278f74fc5d84e23b4046a14eac883f015d (diff) | |
download | gdb-ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf.zip gdb-ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf.tar.gz gdb-ced53ee5daeb7e1f0d2f86fc7f70857b8e8b60cf.tar.bz2 |
* 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 019a2d0..4cfd0fa 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 { |