summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/ld/warnings.c
diff options
context:
space:
mode:
authornate <nate@FreeBSD.org>1995-03-04 17:49:20 +0000
committernate <nate@FreeBSD.org>1995-03-04 17:49:20 +0000
commitb9aa930e449daf128eaaacfe2814dbb378708094 (patch)
treeb4f43ec68fa745cd1357a92fb82d40f827150f50 /gnu/usr.bin/ld/warnings.c
parent44a74d9438343e917536adbb0ef1d2da66f7f761 (diff)
downloadFreeBSD-src-b9aa930e449daf128eaaacfe2814dbb378708094.zip
FreeBSD-src-b9aa930e449daf128eaaacfe2814dbb378708094.tar.gz
Weak symbol support from NetBSD. This should bring us in sync with the
NetBSD ld code except for local changes for dlopen() and friends and the hashing on the minor value of the shlibs. We should be binary compatible now with all their libraries. Obtained from: NetBSD
Diffstat (limited to 'gnu/usr.bin/ld/warnings.c')
-rw-r--r--gnu/usr.bin/ld/warnings.c68
1 files changed, 52 insertions, 16 deletions
diff --git a/gnu/usr.bin/ld/warnings.c b/gnu/usr.bin/ld/warnings.c
index 0479344..3c65a22 100644
--- a/gnu/usr.bin/ld/warnings.c
+++ b/gnu/usr.bin/ld/warnings.c
@@ -1,5 +1,5 @@
/*
- * $Id: warnings.c,v 1.8 1994/06/15 22:40:00 rich Exp $
+ * $Id: warnings.c,v 1.9 1994/12/23 22:30:57 nate Exp $
*/
#include <sys/param.h>
@@ -25,6 +25,8 @@
#include "ld.h"
+static int reported_undefineds;
+
/*
* Print the filename of ENTRY on OUTFILE (a stdio stream),
* and then a newline.
@@ -101,18 +103,21 @@ print_symbols(outfile)
fprintf(outfile, "\nGlobal symbols:\n\n");
FOR_EACH_SYMBOL(i, sp) {
- if (sp->defined == (N_UNDF|N_EXT))
- fprintf(outfile, " %s: common, length %#x\n",
- sp->name, sp->common_size);
+ fprintf(outfile, " %s: ", sp->name);
if (!(sp->flags & GS_REFERENCED))
- fprintf(outfile, " %s: unreferenced\n", sp->name);
+ fprintf(outfile, "unreferenced");
else if (sp->so_defined)
- fprintf(outfile, " %s: sodefined\n", sp->name);
+ fprintf(outfile, "sodefined");
else if (!sp->defined)
- fprintf(outfile, " %s: undefined\n", sp->name);
+ fprintf(outfile, "undefined");
+ else if (sp->defined == (N_UNDF|N_EXT))
+ fprintf(outfile, "common: size %#x", sp->common_size);
else
- fprintf(outfile, " %s: %#x, size %#x\n",
- sp->name, sp->value, sp->size);
+ fprintf(outfile, "type %d, value %#x, size %#x",
+ sp->defined, sp->value, sp->size);
+ if (sp->alias)
+ fprintf(outfile, ", aliased to %s", sp->alias->name);
+ fprintf(outfile, "\n");
} END_EACH_SYMBOL;
each_file(list_file_locals, (void *)outfile);
@@ -463,10 +468,11 @@ do_relocation_warnings(entry, data_segment, outfile, nlist_bitvector)
/* Mark as being noted by relocation warning pass. */
SET_BIT(nlist_bitvector, lsp - start_of_syms);
+ if (g->undef_refs == 0)
+ reported_undefineds++;
if (g->undef_refs >= MAX_UREFS_PRINTED)
/* Listed too many */
continue;
-
/* Undefined symbol which we should mention */
if (++(g->undef_refs) == MAX_UREFS_PRINTED) {
@@ -632,10 +638,28 @@ do_file_warnings (entry, outfile)
line_number = -1;
break;
- default:
-warnx("Unexpected multiple definitions of symbol `%s', type %#x\n", g->name, np->n_type);
+ case N_SIZE | N_EXT:
+ errfmt =
+ "Size element definition of symbol `%s' (multiply defined)";
+ line_number = -1;
+ break;
+
+ case N_INDR | N_EXT:
+ errfmt =
+ "Alias definition of symbol `%s' (multiply defined)";
+ line_number = -1;
+ break;
+
+ case N_UNDF | N_EXT:
/* Don't print out multiple defs at references.*/
continue;
+
+ default:
+ warnx("%s: unexpected multiple definitions "
+ "of symbol `%s', type %#x",
+ get_file_name(entry),
+ g->name, np->n_type);
+ break;
}
} else if (BIT_SET_P(nlist_bitvector, i)) {
@@ -643,9 +667,10 @@ warnx("Unexpected multiple definitions of symbol `%s', type %#x\n", g->name, np-
} else if (list_unresolved_refs &&
!g->defined && !g->so_defined) {
+ if (g->undef_refs == 0)
+ reported_undefineds++;
if (g->undef_refs >= MAX_UREFS_PRINTED)
continue;
-
if (++(g->undef_refs) == MAX_UREFS_PRINTED)
errfmt = "More undefined `%s' refs follow";
else
@@ -656,7 +681,7 @@ warnx("Unexpected multiple definitions of symbol `%s', type %#x\n", g->name, np-
g->def_lsp->entry->flags & E_SECONDCLASS) {
fprintf(outfile,
"%s: Undefined symbol `%s' referenced (use %s ?)\n",
- entry->filename,
+ get_file_name(entry),
g->name,
g->def_lsp->entry->local_sym_name);
continue;
@@ -678,7 +703,7 @@ warnx("Unexpected multiple definitions of symbol `%s', type %#x\n", g->name, np-
continue;
if (line_number == -1)
- fprintf(outfile, "%s: ", entry->filename);
+ fprintf(outfile, "%s: ", get_file_name(entry));
else
fprintf(outfile, "%s:%d: ", file_name, line_number);
@@ -698,8 +723,11 @@ int
do_warnings(outfile)
FILE *outfile;
{
+
list_unresolved_refs = !relocatable_output &&
- (undefined_global_sym_count || undefined_shobj_sym_count);
+ ( (undefined_global_sym_count - undefined_weak_sym_count) > 0
+ || undefined_shobj_sym_count
+ );
list_multiple_defs = multiple_def_count != 0;
if (!(list_unresolved_refs ||
@@ -714,6 +742,14 @@ do_warnings(outfile)
each_file(do_file_warnings, (void *)outfile);
+ if (list_unresolved_refs &&
+ reported_undefineds !=
+ (undefined_global_sym_count - undefined_weak_sym_count))
+ warnx("Spurious undefined symbols: "
+ "# undefined symbols %d, reported %d",
+ (undefined_global_sym_count - undefined_weak_sym_count),
+ reported_undefineds);
+
if (list_unresolved_refs || list_multiple_defs)
return 0;
OpenPOWER on IntegriCloud