* Copyright (c) 1989 The Regents of the University of California.
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)nlist.c 5.8 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
typedef struct nlist NLIST
;
#define _strx n_un.n_strx
#define _name n_un.n_name
#define ISVALID(p) (p->_name && p->_name[0])
off_t strings_offset
, symbol_offset
, symbol_size
, lseek();
int entries
, len
, maxlen
;
if (!(fsym
= fopen(name
, "r")))
if (fread((char *)&ebuf
, sizeof(struct exec
), 1, fsym
) != 1 ||
symbol_offset
= N_SYMOFF(ebuf
);
symbol_size
= ebuf
.a_syms
;
strings_offset
= symbol_offset
+ symbol_size
;
if (fseek(fsym
, symbol_offset
, SEEK_SET
))
if (!(fstr
= fopen(name
, "r")))
* clean out any left-over information for all valid entries.
* Type and value defined to be 0 if not found; historical
* versions cleared other and desc as well. Also figure out
* the largest string length so don't read any more of the
* string table than we have to.
for (p
= list
, entries
= maxlen
= 0; ISVALID(p
); ++p
, ++entries
) {
if ((len
= strlen(p
->_name
)) > maxlen
)
if (++maxlen
> sizeof(sbuf
)) { /* for the NULL */
(void)fprintf(stderr
, "nlist: symbol too large.\n");
for (s
= &nbuf
; symbol_size
; symbol_size
-= sizeof(NLIST
)) {
if (fread((char *)s
, sizeof(NLIST
), 1, fsym
) != 1)
if (!s
->_strx
|| s
->n_type
&N_STAB
)
if (fseek(fstr
, strings_offset
+ s
->_strx
, SEEK_SET
))
(void)fread(sbuf
, sizeof(sbuf
[0]), maxlen
, fstr
);
for (p
= list
; ISVALID(p
); p
++)
if (!strcmp(p
->_name
, sbuf
)) {
done2
: (void)fclose(fstr
);
done1
: (void)fclose(fsym
);