version 1.12, 2001/08/16 15:45:05 |
version 1.13, 2001/08/17 14:25:26 |
|
|
int fcount; |
int fcount; |
|
|
int rev; |
int rev; |
int fname(), rname(), value(); |
int fname __P((const void *, const void *)); |
int (*sfunc)() = fname; |
int rname __P((const void *, const void *)); |
|
int value __P((const void *, const void *)); |
|
int (*sfunc) __P((const void *, const void *)) = fname; |
|
|
|
|
/* some macros for symbol type (nlist.n_type) handling */ |
/* some macros for symbol type (nlist.n_type) handling */ |
|
|
void *emalloc __P((size_t)); |
void *emalloc __P((size_t)); |
void pipe2cppfilt __P((void)); |
void pipe2cppfilt __P((void)); |
void usage __P((void)); |
void usage __P((void)); |
|
char *symname __P((struct nlist *)); |
|
void print_symbol __P((const char *, struct nlist *)); |
|
|
/* |
/* |
* main() |
* main() |
|
|
char *objname; |
char *objname; |
FILE *fp; |
FILE *fp; |
{ |
{ |
register struct nlist *names, *np; |
struct nlist *names, *np; |
|
struct nlist **snames; |
register int i, nnames, nrawnames; |
register int i, nnames, nrawnames; |
struct exec head; |
struct exec head; |
long stabsize; |
long stabsize; |
|
|
/* get memory for the symbol table */ |
/* get memory for the symbol table */ |
names = emalloc((size_t)head.a_syms); |
names = emalloc((size_t)head.a_syms); |
nrawnames = head.a_syms / sizeof(*names); |
nrawnames = head.a_syms / sizeof(*names); |
|
snames = emalloc(nrawnames*sizeof(struct nlist *)); |
if (fread((char *)names, (size_t)head.a_syms, (size_t)1, fp) != 1) { |
if (fread((char *)names, (size_t)head.a_syms, (size_t)1, fp) != 1) { |
warnx("%s: cannot read symbol table", objname); |
warnx("%s: cannot read symbol table", objname); |
(void)free((char *)names); |
(void)free((char *)names); |
|
|
* filter out all entries which we don't want to print anyway |
* filter out all entries which we don't want to print anyway |
*/ |
*/ |
for (np = names, i = nnames = 0; i < nrawnames; np++, i++) { |
for (np = names, i = nnames = 0; i < nrawnames; np++, i++) { |
if (SYMBOL_TYPE(np->n_type) == N_UNDF && np->n_value) |
|
np->n_type = N_COMM | (np->n_type & N_EXT); |
|
if (!print_all_symbols && IS_DEBUGGER_SYMBOL(np->n_type)) |
|
continue; |
|
if (print_only_external_symbols && !IS_EXTERNAL(np->n_type)) |
|
continue; |
|
if (print_only_undefined_symbols && |
|
SYMBOL_TYPE(np->n_type) != N_UNDF) |
|
continue; |
|
|
|
/* |
/* |
* make n_un.n_name a character pointer by adding the string |
* make n_un.n_name a character pointer by adding the string |
* table's base to n_un.n_strx |
* table's base to n_un.n_strx |
|
|
np->n_un.n_name = stab + np->n_un.n_strx; |
np->n_un.n_name = stab + np->n_un.n_strx; |
else |
else |
np->n_un.n_name = ""; |
np->n_un.n_name = ""; |
names[nnames++] = *np; |
if (SYMBOL_TYPE(np->n_type) == N_UNDF && np->n_value) |
|
np->n_type = N_COMM | (np->n_type & N_EXT); |
|
if (!print_all_symbols && IS_DEBUGGER_SYMBOL(np->n_type)) |
|
continue; |
|
if (print_only_external_symbols && !IS_EXTERNAL(np->n_type)) |
|
continue; |
|
if (print_only_undefined_symbols && |
|
SYMBOL_TYPE(np->n_type) != N_UNDF) |
|
continue; |
|
|
|
snames[nnames++] = np; |
} |
} |
|
|
/* sort the symbol table if applicable */ |
/* sort the symbol table if applicable */ |
if (sfunc) |
if (sfunc) |
qsort((char *)names, (size_t)nnames, sizeof(*names), sfunc); |
qsort(snames, (size_t)nnames, sizeof(*snames), sfunc); |
|
|
/* print out symbols */ |
/* print out symbols */ |
for (np = names, i = 0; i < nnames; np++, i++) |
for (i = 0; i < nnames; i++) { |
print_symbol(objname, np); |
if (show_extensions && snames[i] != names && |
|
SYMBOL_TYPE((snames[i] -1)->n_type) == N_INDR) |
|
continue; |
|
print_symbol(objname, snames[i]); |
|
} |
|
|
(void)free((char *)names); |
(void)free(snames); |
|
(void)free(names); |
(void)free(stab); |
(void)free(stab); |
return(0); |
return(0); |
} |
} |
|
|
|
char * |
|
symname(sym) |
|
struct nlist *sym; |
|
{ |
|
if (demangle && sym->n_un.n_name[0] == '_') |
|
return sym->n_un.n_name + 1; |
|
else |
|
return sym->n_un.n_name; |
|
} |
|
|
/* |
/* |
* print_symbol() |
* print_symbol() |
* show one symbol |
* show one symbol |
*/ |
*/ |
|
void |
print_symbol(objname, sym) |
print_symbol(objname, sym) |
char *objname; |
const char *objname; |
register struct nlist *sym; |
struct nlist *sym; |
{ |
{ |
char *typestring(), typeletter(), *otherstring(); |
char *typestring(), typeletter(), *otherstring(); |
|
|
|
|
*/ |
*/ |
if (!print_only_undefined_symbols) { |
if (!print_only_undefined_symbols) { |
/* print symbol's value */ |
/* print symbol's value */ |
if (SYMBOL_TYPE(sym->n_type) == N_UNDF) |
if (SYMBOL_TYPE(sym->n_type) == N_UNDF || |
|
(show_extensions && SYMBOL_TYPE(sym->n_type) == N_INDR && |
|
sym->n_value == 0)) |
(void)printf(" "); |
(void)printf(" "); |
else |
else |
(void)printf("%08lx", sym->n_value); |
(void)printf("%08lx", sym->n_value); |
|
|
(void)printf(" %c ", typeletter(sym->n_type)); |
(void)printf(" %c ", typeletter(sym->n_type)); |
} |
} |
|
|
/* print the symbol's name */ |
if (SYMBOL_TYPE(sym->n_type) == N_INDR && show_extensions) { |
if (demangle && sym->n_un.n_name[0] == '_') |
printf("%s -> %s\n", symname(sym), symname(sym+1)); |
(void)puts(sym->n_un.n_name + 1); |
} |
else |
else |
(void)puts(sym->n_un.n_name); |
(void)puts(symname(sym)); |
} |
} |
|
|
#define AUX_OBJECT 1 |
#define AUX_OBJECT 1 |
|
|
return('?'); |
return('?'); |
} |
} |
|
|
|
int |
fname(a0, b0) |
fname(a0, b0) |
void *a0, *b0; |
const void *a0, *b0; |
{ |
{ |
struct nlist *a = a0, *b = b0; |
struct nlist * const *a = a0, * const *b = b0; |
|
|
return(strcmp(a->n_un.n_name, b->n_un.n_name)); |
return(strcmp((*a)->n_un.n_name, (*b)->n_un.n_name)); |
} |
} |
|
|
|
int |
rname(a0, b0) |
rname(a0, b0) |
void *a0, *b0; |
const void *a0, *b0; |
{ |
{ |
struct nlist *a = a0, *b = b0; |
struct nlist * const *a = a0, * const *b = b0; |
|
|
return(strcmp(b->n_un.n_name, a->n_un.n_name)); |
return(strcmp((*b)->n_un.n_name, (*a)->n_un.n_name)); |
} |
} |
|
|
|
int |
value(a0, b0) |
value(a0, b0) |
void *a0, *b0; |
const void *a0, *b0; |
{ |
{ |
register struct nlist *a = a0, *b = b0; |
struct nlist * const *a = a0, * const *b = b0; |
|
|
if (SYMBOL_TYPE(a->n_type) == N_UNDF) |
if (SYMBOL_TYPE((*a)->n_type) == N_UNDF) |
if (SYMBOL_TYPE(b->n_type) == N_UNDF) |
if (SYMBOL_TYPE((*b)->n_type) == N_UNDF) |
return(0); |
return(0); |
else |
else |
return(-1); |
return(-1); |
else if (SYMBOL_TYPE(b->n_type) == N_UNDF) |
else if (SYMBOL_TYPE((*b)->n_type) == N_UNDF) |
return(1); |
return(1); |
if (rev) { |
if (rev) { |
if (a->n_value == b->n_value) |
if ((*a)->n_value == (*b)->n_value) |
return(rname(a0, b0)); |
return(rname(a0, b0)); |
return(b->n_value > a->n_value ? 1 : -1); |
return((*b)->n_value > (*a)->n_value ? 1 : -1); |
} else { |
} else { |
if (a->n_value == b->n_value) |
if ((*a)->n_value == (*b)->n_value) |
return(fname(a0, b0)); |
return(fname(a0, b0)); |
return(a->n_value > b->n_value ? 1 : -1); |
return((*a)->n_value > (*b)->n_value ? 1 : -1); |
} |
} |
} |
} |
|
|