Rudimentry support for viewing weak symbols. There are two types that
this deals with, the N_INDR indirect symbols done with .stabs operations, and those done with .weak that have an extra field in n_other.
This commit is contained in:
parent
86c863abe8
commit
142a5685e6
@ -30,7 +30,7 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)nm.1 8.1 (Berkeley) 6/6/93
|
||||
.\" $Id$
|
||||
.\" $Id: nm.1,v 1.3 1996/08/29 18:06:05 wosch Exp $
|
||||
.\"
|
||||
.Dd June 6, 1993
|
||||
.Dt NM 1
|
||||
@ -40,7 +40,7 @@
|
||||
.Nd display name list (symbol table)
|
||||
.Sh SYNOPSIS
|
||||
.Nm nm
|
||||
.Op Fl agnoprtuw
|
||||
.Op Fl agnoprtuwW
|
||||
.Ar
|
||||
.Sh DESCRIPTION
|
||||
The symbol table (name list) of each object in
|
||||
@ -80,6 +80,8 @@ Display undefined symbols only.
|
||||
Warn about non-object archive members.
|
||||
Normally, nm will silently ignore all archive members which are not
|
||||
object files.
|
||||
.It Fl W
|
||||
Include an extra column in the output with a ``W'' indicating weak symbols.
|
||||
.El
|
||||
.Pp
|
||||
Each symbol name is preceded by its value (a blank field if the symbol
|
||||
@ -100,10 +102,14 @@ common symbol
|
||||
data segment symbol
|
||||
.It Li f
|
||||
file name
|
||||
.It Li I
|
||||
indirect reference symbol
|
||||
.It Li T
|
||||
text segment symbol
|
||||
.It Li U
|
||||
undefined
|
||||
.It Li W
|
||||
warn if next symbol is referenced
|
||||
.El
|
||||
.Pp
|
||||
If the symbol is local (non-external) the type letter is in lower case.
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)nm.1 8.1 (Berkeley) 6/6/93
|
||||
.\" $Id$
|
||||
.\" $Id: nm.1,v 1.3 1996/08/29 18:06:05 wosch Exp $
|
||||
.\"
|
||||
.Dd June 6, 1993
|
||||
.Dt NM 1
|
||||
@ -40,7 +40,7 @@
|
||||
.Nd display name list (symbol table)
|
||||
.Sh SYNOPSIS
|
||||
.Nm nm
|
||||
.Op Fl agnoprtuw
|
||||
.Op Fl agnoprtuwW
|
||||
.Ar
|
||||
.Sh DESCRIPTION
|
||||
The symbol table (name list) of each object in
|
||||
@ -80,6 +80,8 @@ Display undefined symbols only.
|
||||
Warn about non-object archive members.
|
||||
Normally, nm will silently ignore all archive members which are not
|
||||
object files.
|
||||
.It Fl W
|
||||
Include an extra column in the output with a ``W'' indicating weak symbols.
|
||||
.El
|
||||
.Pp
|
||||
Each symbol name is preceded by its value (a blank field if the symbol
|
||||
@ -100,10 +102,14 @@ common symbol
|
||||
data segment symbol
|
||||
.It Li f
|
||||
file name
|
||||
.It Li I
|
||||
indirect reference symbol
|
||||
.It Li T
|
||||
text segment symbol
|
||||
.It Li U
|
||||
undefined
|
||||
.It Li W
|
||||
warn if next symbol is referenced
|
||||
.El
|
||||
.Pp
|
||||
If the symbol is local (non-external) the type letter is in lower case.
|
||||
|
@ -62,6 +62,7 @@ int print_only_external_symbols;
|
||||
int print_only_undefined_symbols;
|
||||
int print_all_symbols;
|
||||
int print_file_each_line;
|
||||
int print_weak_symbols;
|
||||
int fcount;
|
||||
|
||||
int rev, table;
|
||||
@ -72,6 +73,7 @@ int (*sfunc)() = fname;
|
||||
#define IS_DEBUGGER_SYMBOL(x) ((x) & N_STAB)
|
||||
#define IS_EXTERNAL(x) ((x) & N_EXT)
|
||||
#define SYMBOL_TYPE(x) ((x) & (N_TYPE | N_STAB))
|
||||
#define SYMBOL_BIND(x) (((x) >> 4) & 0xf)
|
||||
|
||||
void *emalloc();
|
||||
void usage __P(( void ));
|
||||
@ -79,6 +81,7 @@ int process_file __P(( char * ));
|
||||
int show_archive __P(( char *, FILE * ));
|
||||
int show_objfile __P(( char *, FILE * ));
|
||||
void print_symbol __P(( char *, struct nlist * ));
|
||||
char typeletter __P((u_char));
|
||||
|
||||
/*
|
||||
* main()
|
||||
@ -93,7 +96,7 @@ main(argc, argv)
|
||||
extern int optind;
|
||||
int ch, errors;
|
||||
|
||||
while ((ch = getopt(argc, argv, "agnoprtuw")) != EOF) {
|
||||
while ((ch = getopt(argc, argv, "agnoprtuwW")) != EOF) {
|
||||
switch (ch) {
|
||||
case 'a':
|
||||
print_all_symbols = 1;
|
||||
@ -122,6 +125,9 @@ main(argc, argv)
|
||||
case 'w':
|
||||
ignore_bad_archive_entries = 0;
|
||||
break;
|
||||
case 'W':
|
||||
print_weak_symbols = 1;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
@ -471,7 +477,7 @@ print_symbol(objname, sym)
|
||||
char *objname;
|
||||
register struct nlist *sym;
|
||||
{
|
||||
char *typestring(), typeletter();
|
||||
char *typestring();
|
||||
|
||||
if (table) {
|
||||
printf("%s|", objname);
|
||||
@ -481,8 +487,12 @@ print_symbol(objname, sym)
|
||||
if (IS_DEBUGGER_SYMBOL(sym->n_type))
|
||||
(void)printf("-|%02x %04x %5s|", sym->n_other,
|
||||
sym->n_desc&0xffff, typestring(sym->n_type));
|
||||
else
|
||||
(void)printf("%c|", typeletter(sym->n_type));
|
||||
else {
|
||||
putchar(typeletter(sym->n_type));
|
||||
if (print_weak_symbols && SYMBOL_BIND(sym->n_other)== 2)
|
||||
putchar('W');
|
||||
putchar('|');
|
||||
}
|
||||
|
||||
/* print the symbol's name */
|
||||
(void)printf("%s\n",sym->n_un.n_name);
|
||||
@ -510,8 +520,17 @@ print_symbol(objname, sym)
|
||||
if (IS_DEBUGGER_SYMBOL(sym->n_type))
|
||||
(void)printf(" - %02x %04x %5s ", sym->n_other,
|
||||
sym->n_desc&0xffff, typestring(sym->n_type));
|
||||
else
|
||||
(void)printf(" %c ", typeletter(sym->n_type));
|
||||
else {
|
||||
putchar(' ');
|
||||
putchar(typeletter(sym->n_type));
|
||||
if (print_weak_symbols) {
|
||||
if (SYMBOL_BIND(sym->n_other) == 2)
|
||||
putchar('W');
|
||||
else
|
||||
putchar(' ');
|
||||
}
|
||||
putchar(' ');
|
||||
}
|
||||
|
||||
/* print the symbol's name */
|
||||
(void)puts(sym->n_un.n_name);
|
||||
@ -590,7 +609,10 @@ typeletter(type)
|
||||
case N_DATA:
|
||||
return(IS_EXTERNAL(type) ? 'D' : 'd');
|
||||
case N_FN:
|
||||
return(IS_EXTERNAL(type) ? 'F' : 'f');
|
||||
/* This one is overloaded. EXT = Warn, INT = filename */
|
||||
return(IS_EXTERNAL(type) ? 'W' : 'f');
|
||||
case N_INDR:
|
||||
return(IS_EXTERNAL(type) ? 'I' : 'i');
|
||||
case N_TEXT:
|
||||
return(IS_EXTERNAL(type) ? 'T' : 't');
|
||||
case N_UNDF:
|
||||
|
Loading…
Reference in New Issue
Block a user