nlist(3) loses with duplicate symbols
ok at quintus
ok at quintus
Thu Nov 24 19:20:17 AEST 1988
If you give nlist(3) a name-list vector which contains duplicate
copies of symbols, only the first is correctly set. I wanted to
generate a table of addresses, and gave nlist() the symbols I
wanted the addresses of in the order that I wanted them. There
is nothing in the manual to suggest that it shouldn't work, but
it doesn't.
Tested on
SunOS 3.2, Sequent Dynix (4.2), UTek (4.2), Intel 386 (V.3)
#!/bin/sh
cat >nlistbug.c <<'EOF'
/* This program illustrates a bug in nlist(3).
The manual page says
Each name is looked up in the name list of the file.
If the name is found, the type and value of the name are
inserted in [[n_type and n_value]].
If the name is not found, both entries are set to 0.
If a symbol appears twice in the name-list, you would expect,
from this description, that both copies would be filled in.
But only the first occurrence is filled in, and later ones are
treated as if the symbol could not be found.
Nothing in the manual page says a symbol should appear only once
in the name-list argument!
To demonstrate this bug on 4.xBSD systems:
% cc nlistbug.c
% a.out
To demonstrate this bug on System V systems:
$ cc -DSYS5 nlistbug.c
$ a.out
If the bug is present, the first entry will be ok and the second
entry will have zeros. If both have zeros, something else is wrong.
*/
#include <stdio.h>
#include <nlist.h>
main()
{
int i;
struct nlist NL[3];
static char myname[] =
#ifdef SYS5
"main";
#else /*BSD4*/
"_main";
#endif/*SYS5*/
static char myfile[] = "a.out";
NL[0].n_name = myname;
NL[1].n_name = myname;
NL[2].n_name = NULL;
i = nlist(myfile, NL);
if (-1 == i) {
printf("nlist(\"%s\", ...) failed\n", myfile);
} else {
printf("nlist(\"%s\", ...) returned %d\n", myfile, i);
for (i = 0; i < (sizeof NL)/(sizeof NL[0])-1; i++)
printf("NL[%d] = {%s, %x, %lu)\n",
i, NL[i].n_name, NL[i].n_type, NL[i].n_value);
}
exit(0);
}
EOF
exit 0
--
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list