示例#1
0
文件: nm.c 项目: 99years/plan9
/*
 * get the symbol table from an executable file, if it has one
 */
void
execsyms(int fd)
{
	Fhdr f;
	Sym *s;
	long n;

	seek(fd, 0, 0);
	if (crackhdr(fd, &f) == 0) {
		error("Can't read header for %s", filename);
		return;
	}
	if (syminit(fd, &f) < 0)
		return;
	s = symbase(&n);
	nsym = 0;
	while(n--)
		psym(s++, 0);

	printsyms(symptr, nsym);
}
示例#2
0
文件: nm.c 项目: Ahmah2009/golang
/*
 * read an archive file,
 * processing the symbols for each intermediate file in it.
 */
void
doar(Biobuf *bp)
{
	int offset, size, obj;
	char name[SARNAME];

	multifile = 1;
	for (offset = Boffset(bp);;offset += size) {
		size = nextar(bp, offset, name);
		if (size < 0) {
			error("phase error on ar header %d", offset);
			return;
		}
		if (size == 0)
			return;
		if (strcmp(name, symname) == 0)
			continue;
		obj = objtype(bp, 0);
		if (obj < 0) {
			// perhaps foreign object
			if(strlen(name) > 2 && strcmp(name+strlen(name)-2, ".o") == 0)
				return;
			error("inconsistent file %s in %s",
					name, filename);
			return;
		}
		if (!readar(bp, obj, offset+size, 1)) {
			error("invalid symbol reference in file %s",
					name);
			return;
		}
		filename = name;
		nsym=0;
		objtraverse(psym, 0);
		printsyms(symptr, nsym);
	}
}