aboutsummaryrefslogtreecommitdiff
path: root/ld/ldindr.c
diff options
context:
space:
mode:
authorSteve Chamberlain <sac@cygnus>1992-05-06 20:31:01 +0000
committerSteve Chamberlain <sac@cygnus>1992-05-06 20:31:01 +0000
commit32846f9c3e3714fcc88615c9f670850a5978354a (patch)
tree490dc4552d75e73f34dc5bf2971a9d777f431d48 /ld/ldindr.c
parent5a9b659196a4c5f00620b41cae80a9b9df2ccd4b (diff)
downloadgdb-32846f9c3e3714fcc88615c9f670850a5978354a.zip
gdb-32846f9c3e3714fcc88615c9f670850a5978354a.tar.gz
gdb-32846f9c3e3714fcc88615c9f670850a5978354a.tar.bz2
changed calling convention for Q_enter_global_ref
* ldexp.c, ldlang.c, ldmain.c: reflect this * ldver.c: bump version to 1.97.1 * ldindr.c (add_indirect): when an edict declaring an indirect symbol is found, make sure that any ideas about the symbol being common are changed if it now known to be defined. * ldmain.c (linear_library): complain once if archive isn't ranlibbed. * ldlang.h, ldlang.c: make room for and initialize the complain once field.
Diffstat (limited to 'ld/ldindr.c')
-rw-r--r--ld/ldindr.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/ld/ldindr.c b/ld/ldindr.c
index 834c627..82efe33 100644
--- a/ld/ldindr.c
+++ b/ld/ldindr.c
@@ -1,6 +1,10 @@
/* ldindr.c
Handle indirect symbols.
+ An indirect symbol is where a global symbol in one file say's that
+ all refs like it should be turned into refs of the symbol pointed
+ at by the value of the indirect symbol.
+
BFD supplies symbols to be indirected with the BFD_INDIRECT bit
set. Whenever the linker gets one of these, it calls add_indirect
with the symbol. We look up the symbol which this one dereferneces,
@@ -42,17 +46,40 @@ asymbol **b_list)
}
}
+#if 0
+void
+DEFUN(copy_over,(ldsym, bfdsym),
+ ldsym_type *ldsym AND
+ asymbol **bfdsym)
+{
+ while (list && *list)
+ {
+ refize(Q_enter_global_ref(list, name);
+ list = (asymbol **)((*list)->udata);
+ }
+}
+#endif
+
+/* This call allows us to change the symbol table so that all future
+ refs to the symbol are patched to know the alias - but we still
+ have to fix all the old ones */
void
DEFUN(add_indirect,(ptr),
asymbol **ptr)
{
+ asymbol **p;
ldsym_type *lgs = ldsym_get((*ptr)->name);
ldsym_type *new = ldsym_get(((asymbol *)((*ptr)->value))->name);
/* If the mapping has already been done, stop now */
if (lgs == new) return;
+
lgs->flags |= SYM_INDIRECT;
+ if (lgs->sdefs_chain && lgs->sdefs_chain[0])
+ {
+ einfo("indirect symbol already has definition %s", lgs->sdefs_chain[0]);
+ }
new->scoms_chain = move_it(new->scoms_chain, lgs->scoms_chain);
lgs->scoms_chain = 0;
new->srefs_chain = move_it(new->srefs_chain, lgs->srefs_chain);
@@ -60,7 +87,12 @@ asymbol **ptr)
new->sdefs_chain = move_it(new->sdefs_chain, lgs->sdefs_chain);
lgs->sdefs_chain = 0;
- lgs->sdefs_chain = (asymbol **)new;
+ /* If the result has any commons they should be turned into refs */
+
+ if (new->sdefs_chain && new->scoms_chain)
+ {
+ refize(new, new->scoms_chain);
+ }
}