diff options
author | Peter Schauer <Peter.Schauer@mytum.de> | 1996-11-02 11:59:19 +0000 |
---|---|---|
committer | Peter Schauer <Peter.Schauer@mytum.de> | 1996-11-02 11:59:19 +0000 |
commit | 73b8e6a91526a2c6b6ef77730844aabaaa0886fe (patch) | |
tree | d7c6a4be7189f459e26eb934224b2c214c1af105 /gdb/stabsread.c | |
parent | 61e5b759cda25bec432271b643f32880faa430f4 (diff) | |
download | gdb-73b8e6a91526a2c6b6ef77730844aabaaa0886fe.zip gdb-73b8e6a91526a2c6b6ef77730844aabaaa0886fe.tar.gz gdb-73b8e6a91526a2c6b6ef77730844aabaaa0886fe.tar.bz2 |
* irix5-nat.c, osfsolib.c, solib.c (symbol_add_stub): Handle
missing or zero-sized .text sections properly.
* mdebugread.c: Handle scRConst and scSUndefined storage classes.
* stabsread.c (scan_file_globals): Try to resolve symbols
for shared libraries from the minimal symbol table of the main
executable first.
Diffstat (limited to 'gdb/stabsread.c')
-rw-r--r-- | gdb/stabsread.c | 144 |
1 files changed, 81 insertions, 63 deletions
diff --git a/gdb/stabsread.c b/gdb/stabsread.c index be312af..175415d 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -4491,87 +4491,105 @@ scan_file_globals (objfile) int hash; struct minimal_symbol *msymbol; struct symbol *sym, *prev; + struct objfile *resolve_objfile; - /* Avoid expensive loop through all minimal symbols if there are - no unresolved symbols. */ - for (hash = 0; hash < HASHSIZE; hash++) - { - if (global_sym_chain[hash]) - break; - } - if (hash >= HASHSIZE) - return; + /* SVR4 based linkers copy referenced global symbols from shared + libraries to the main executable. + If we are scanning the symbols for a shared library, try to resolve + them from the minimal symbols of the main executable first. */ - for (msymbol = objfile -> msymbols; - msymbol && SYMBOL_NAME (msymbol) != NULL; - msymbol++) - { - QUIT; + if (symfile_objfile && objfile != symfile_objfile) + resolve_objfile = symfile_objfile; + else + resolve_objfile = objfile; - /* Skip static symbols. */ - switch (MSYMBOL_TYPE (msymbol)) + while (1) + { + /* Avoid expensive loop through all minimal symbols if there are + no unresolved symbols. */ + for (hash = 0; hash < HASHSIZE; hash++) { - case mst_file_text: - case mst_file_data: - case mst_file_bss: - continue; - default: - break; + if (global_sym_chain[hash]) + break; } + if (hash >= HASHSIZE) + return; - prev = NULL; + for (msymbol = resolve_objfile -> msymbols; + msymbol && SYMBOL_NAME (msymbol) != NULL; + msymbol++) + { + QUIT; - /* Get the hash index and check all the symbols - under that hash index. */ + /* Skip static symbols. */ + switch (MSYMBOL_TYPE (msymbol)) + { + case mst_file_text: + case mst_file_data: + case mst_file_bss: + continue; + default: + break; + } - hash = hashname (SYMBOL_NAME (msymbol)); + prev = NULL; - for (sym = global_sym_chain[hash]; sym;) - { - if (SYMBOL_NAME (msymbol)[0] == SYMBOL_NAME (sym)[0] && - STREQ(SYMBOL_NAME (msymbol) + 1, SYMBOL_NAME (sym) + 1)) + /* Get the hash index and check all the symbols + under that hash index. */ + + hash = hashname (SYMBOL_NAME (msymbol)); + + for (sym = global_sym_chain[hash]; sym;) { - /* Splice this symbol out of the hash chain and - assign the value we have to it. */ - if (prev) - { - SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym); - } - else + if (SYMBOL_NAME (msymbol)[0] == SYMBOL_NAME (sym)[0] && + STREQ(SYMBOL_NAME (msymbol) + 1, SYMBOL_NAME (sym) + 1)) { - global_sym_chain[hash] = SYMBOL_VALUE_CHAIN (sym); - } - - /* Check to see whether we need to fix up a common block. */ - /* Note: this code might be executed several times for - the same symbol if there are multiple references. */ + /* Splice this symbol out of the hash chain and + assign the value we have to it. */ + if (prev) + { + SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym); + } + else + { + global_sym_chain[hash] = SYMBOL_VALUE_CHAIN (sym); + } + + /* Check to see whether we need to fix up a common block. */ + /* Note: this code might be executed several times for + the same symbol if there are multiple references. */ - if (SYMBOL_CLASS (sym) == LOC_BLOCK) - { - fix_common_block (sym, SYMBOL_VALUE_ADDRESS (msymbol)); - } - else - { - SYMBOL_VALUE_ADDRESS (sym) = SYMBOL_VALUE_ADDRESS (msymbol); - } + if (SYMBOL_CLASS (sym) == LOC_BLOCK) + { + fix_common_block (sym, SYMBOL_VALUE_ADDRESS (msymbol)); + } + else + { + SYMBOL_VALUE_ADDRESS (sym) + = SYMBOL_VALUE_ADDRESS (msymbol); + } - SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol); - - if (prev) - { - sym = SYMBOL_VALUE_CHAIN (prev); + SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol); + + if (prev) + { + sym = SYMBOL_VALUE_CHAIN (prev); + } + else + { + sym = global_sym_chain[hash]; + } } else { - sym = global_sym_chain[hash]; + prev = sym; + sym = SYMBOL_VALUE_CHAIN (sym); } } - else - { - prev = sym; - sym = SYMBOL_VALUE_CHAIN (sym); - } } + if (resolve_objfile == objfile) + break; + resolve_objfile = objfile; } /* Change the storage class of any remaining unresolved globals to @@ -4593,7 +4611,7 @@ scan_file_globals (objfile) SYMBOL_CLASS (prev) = LOC_UNRESOLVED; else complain (&unresolved_sym_chain_complaint, - objfile->name, SYMBOL_NAME (prev)); + objfile -> name, SYMBOL_NAME (prev)); } } memset (global_sym_chain, 0, sizeof (global_sym_chain)); |