** print symbol tables for
** object or archive files
** nm [-goprun] [name ...]
#define MAGIC exp.a_magic
#define BADMAG MAGIC!=A_MAGIC1 && MAGIC!=A_MAGIC2 \
&& MAGIC!=A_MAGIC3 && MAGIC!=A_MAGIC4 && MAGIC != 0412 && MAGIC != 0413
#define SELECT arch_flg ? arp.ar_name : *argv
if (--argc
>0 && argv
[1][0]=='-' && argv
[1][1]!=0) {
while (*++*argv
) switch (**argv
) {
case 'n': /* sort numerically */
case 'g': /* globl symbols only */
case 'u': /* undefined symbols only */
case 'r': /* sort in reverse order */
case 'p': /* don't sort -- symbol table order */
case 'o': /* prepend a name to each line */
fprintf(stderr
, "nm: invalid argument -%c\n", *argv
[0]);
fprintf(stderr
, "nm: cannot open %s\n", *argv
);
off
= sizeof(exp
.a_magic
);
fread((char *)&exp
, 1, sizeof(MAGIC
), fi
); /* get magic no. */
fprintf(stderr
, "nm: %s-- bad format\n", *argv
);
printf("\n%s:\n", *argv
);
struct nlist
*symp
= NULL
;
fread((char *)&exp
, 1, sizeof(struct exec
), fi
);
if (BADMAG
) /* archive element not in */
continue; /* proper format - skip it */
o
= (long)exp
.a_text
+ exp
.a_data
+ exp
.a_trsize
+ exp
.a_drsize
;
if (MAGIC
==0412 || MAGIC
==0413)
o
+= PAGSIZ
- sizeof(struct exec
);
n
= exp
.a_syms
/ sizeof(struct nlist
);
fprintf(stderr
, "nm: %s-- no name list\n", SELECT
);
fread((char *)&sym
, 1, sizeof(sym
), fi
);
if (globl_flg
&& (sym
.n_type
&N_EXT
)==0)
symp
= (struct nlist
*)malloc(sizeof(struct nlist
));
symp
= (struct nlist
*)realloc(symp
, (i
+1)*sizeof(struct nlist
));
fprintf(stderr
, "nm: out of memory on %s\n", *argv
);
qsort(symp
, i
, sizeof(struct nlist
), compare
);
if ((arch_flg
|| narg
>1) && prep_flg
==0)
printf("\n%s:\n", SELECT
);
printf("%08x - %-8.8s %02x %02x %04x\n",
symp
[n
].n_desc
& 0xffff);
switch (c
&(N_TYPE
-N_EXT
)) {
if (symp
[n
].n_type
&N_EXT
)
printf(FORMAT
, symp
[n
].n_value
);
printf("%.8s\n", symp
[n
].n_name
);
} while(arch_flg
&& nextel(fi
));
if (p1
->n_value
> p2
->n_value
)
if (p1
->n_value
< p2
->n_value
)
for(i
=0; i
<sizeof(p1
->n_name
); i
++)
if (p1
->n_name
[i
] != p2
->n_name
[i
]) {
if (p1
->n_name
[i
] > p2
->n_name
[i
])
r
= fread((char *)&arp
, 1, sizeof(struct ar_hdr
), af
); /* read archive header */
off
= ftell(af
) + arp
.ar_size
; /* offset to next element */