From: Ian Lance Taylor Date: Wed, 8 Nov 1995 19:08:18 +0000 (+0000) Subject: more XCOFF linker hackery X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=417acf225f037c90f320d8913249e5600ff853e0;p=binutils-gdb.git more XCOFF linker hackery --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8321577725a..df7678cbe75 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -6,8 +6,11 @@ Wed Nov 8 11:31:11 1995 Ian Lance Taylor (xcoff_swap_ldsym_in): New static function. (xcoff_link_add_symbols): If we just created a descriptor, pass it to _bfd_generic_link_add_one_symbol, to save a hash lookup. + Handle XTY_ER/XMC_XO symbols correctly. (xcoff_link_add_dynamic_symbols): Rewrite to read .loader symbols rather than normal symbol table. + (bfd_xcoff_import_symbol): It's not an error if the symbol is + already defined with the same absolute value. (xcoff_mark): When considering called symbols, check whether the descriptor is from a dynamic object, rather than the symbol itself. diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c index 7742461c415..b13e9004b77 100644 --- a/bfd/xcofflink.c +++ b/bfd/xcofflink.c @@ -1263,7 +1263,16 @@ xcoff_link_add_symbols (abfd, info) bfd_set_error (bfd_error_bad_value); goto error_return; } - section = bfd_und_section_ptr; + + /* An XMC_XO external reference is actually a reference to + an absolute location. */ + if (aux.x_csect.x_smclas != XMC_XO) + section = bfd_und_section_ptr; + else + { + section = bfd_abs_section_ptr; + value = sym.n_value; + } break; case XTY_SD: @@ -1931,12 +1940,6 @@ xcoff_link_add_dynamic_symbols (abfd, info) if ((ldsym.l_smtype & L_EXPORT) == 0) continue; - /* All we have to do is look up the symbol in the hash table. - If it's not there, we just won't import it. Normally we - could not xcoff_link_hash_lookup in an add symbols routine, - since we might not be using an XCOFF hash table. However, we - verified above that we are using an XCOFF hash table. */ - if (ldsym._l._l_l._l_zeroes == 0) name = strings + ldsym._l._l_l._l_offset; else @@ -1946,25 +1949,52 @@ xcoff_link_add_dynamic_symbols (abfd, info) name = nambuf; } - h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, false, - false, true); - if (h != NULL) + /* Normally we could not xcoff_link_hash_lookup in an add + symbols routine, since we might not be using an XCOFF hash + table. However, we verified above that we are using an XCOFF + hash table. */ + + h = xcoff_link_hash_lookup (xcoff_hash_table (info), name, true, + true, true); + if (h == NULL) + goto error_return; + + h->flags |= XCOFF_DEF_DYNAMIC; + + /* If the symbol is undefined, and the BFD it was found in is + not a dynamic object, change the BFD to this dynamic object, + so that we can get the correct import file ID. */ + if ((h->root.type == bfd_link_hash_undefined + || h->root.type == bfd_link_hash_undefweak) + && (h->root.u.undef.abfd == NULL + || (h->root.u.undef.abfd->flags & DYNAMIC) == 0)) + h->root.u.undef.abfd = abfd; + + if (h->root.type == bfd_link_hash_new) + { + h->root.type = bfd_link_hash_undefined; + h->root.u.undef.abfd = abfd; + /* We do not want to add this to the undefined symbol list. */ + } + + if (h->smclas == XMC_UA + || h->root.type == bfd_link_hash_undefined + || h->root.type == bfd_link_hash_undefweak) + h->smclas = ldsym.l_smclas; + + /* Unless this is an XMC_XO symbol, we don't bother to actually + define it, since we don't have a section to put it in anyhow. + Instead, the relocation routines handle the DEF_DYNAMIC flag + correctly. */ + + if (h->smclas == XMC_XO + && (h->root.type == bfd_link_hash_undefined + || h->root.type == bfd_link_hash_undefweak)) { - h->flags |= XCOFF_DEF_DYNAMIC; - - /* If the symbol is undefined, and the BFD it was found in - is not a dynamic object, change the BFD to this dynamic - object, so that we can get the correct import file ID. */ - if ((h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - && (h->root.u.undef.abfd == NULL - || (h->root.u.undef.abfd->flags & DYNAMIC) == 0)) - h->root.u.undef.abfd = abfd; - - if (h->smclas == XMC_UA - || h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak) - h->smclas = ldsym.l_smclas; + /* This symbol has an absolute value. */ + h->root.type = bfd_link_hash_defined; + h->root.u.def.section = bfd_abs_section_ptr; + h->root.u.def.value = ldsym.l_value; } } @@ -2287,7 +2317,9 @@ bfd_xcoff_import_symbol (output_bfd, info, harg, val, imppath, impfile, if (val != (bfd_vma) -1) { - if (h->root.type == bfd_link_hash_defined) + if (h->root.type == bfd_link_hash_defined + && (! bfd_is_abs_section (h->root.u.def.section) + || h->root.u.def.value != val)) { if (! ((*info->callbacks->multiple_definition) (info, h->root.root.string, h->root.u.def.section->owner,