diff options
author | Alan Modra <amodra@gmail.com> | 2002-01-29 14:52:12 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2002-01-29 14:52:12 +0000 |
commit | 648cca2cac243496564d7bb65b70aabb091e6659 (patch) | |
tree | a8d9d646aebad130e55fe584317b61d166114563 /bfd/elf64-ppc.c | |
parent | ef9d813eafbff4630efb4ba6580ff7065579c0f2 (diff) | |
download | gdb-648cca2cac243496564d7bb65b70aabb091e6659.zip gdb-648cca2cac243496564d7bb65b70aabb091e6659.tar.gz gdb-648cca2cac243496564d7bb65b70aabb091e6659.tar.bz2 |
Arrgh! Revert last change.
Diffstat (limited to 'bfd/elf64-ppc.c')
-rw-r--r-- | bfd/elf64-ppc.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 855722e..da339bb 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -2494,11 +2494,43 @@ func_desc_adjust (h, inf) struct elf_link_hash_entry *fdh; boolean force_local; - /* Find the corresponding function descriptor symbol. */ + /* Find the corresponding function descriptor symbol. Create it + as undefined if necessary. */ fdh = elf_link_hash_lookup (&htab->elf, h->root.root.string + 1, false, false, true); + if (fdh == NULL && info->shared) + { + bfd *abfd; + asymbol *newsym; + + /* Create it as undefined. */ + if (h->root.type == bfd_link_hash_undefined + || h->root.type == bfd_link_hash_undefweak) + abfd = h->root.u.undef.abfd; + else if (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak) + abfd = h->root.u.def.section->owner; + else + abort (); + newsym = bfd_make_empty_symbol (abfd); + newsym->name = h->root.root.string + 1; + newsym->section = bfd_und_section_ptr; + newsym->value = 0; + newsym->flags = BSF_OBJECT; + if (h->root.type == bfd_link_hash_undefweak) + newsym->flags |= BSF_WEAK; + + if ( !(_bfd_generic_link_add_one_symbol + (info, abfd, newsym->name, newsym->flags, + newsym->section, newsym->value, NULL, false, false, + (struct bfd_link_hash_entry **) &fdh))) + { + return false; + } + } + if (fdh != NULL && (fdh->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0 && (info->shared |