diff options
author | Russ Cox <rsc@golang.org> | 2013-09-16 20:27:57 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2013-09-16 20:27:57 -0400 |
commit | 6ef10b261c58b240692aba71c0be2e012e65d94b (patch) | |
tree | 75e250444756eb18943924060596d2f3249f9e8a /src/cmd/nm | |
parent | 26400f02c8ce22eff3bdd6d5ca2cfc8dc76e7149 (diff) | |
download | go-6ef10b261c58b240692aba71c0be2e012e65d94b.tar.gz |
cmd/nm: make -S listing a bit more accurate
Hide container symbols like text and etext so that
the individual pieces inside are shown instead.
For example, if text and main.init have the same
address, it was a toss-up which name was printed.
R=golang-dev, iant
CC=golang-dev
https://codereview.appspot.com/13722046
Diffstat (limited to 'src/cmd/nm')
-rw-r--r-- | src/cmd/nm/nm.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/src/cmd/nm/nm.c b/src/cmd/nm/nm.c index b5e1ca0b6..820942426 100644 --- a/src/cmd/nm/nm.c +++ b/src/cmd/nm/nm.c @@ -299,6 +299,37 @@ psym(Sym *s, void* p) symptr[nsym++] = s; } +const char *skipnames[] = { + "bss", + "data", + "ebss", + "edata", + "egcbss", + "egcdata", + "enoptrbss", + "enoptrdata", + "epclntab", + "erodata", + "esymtab", + "etext", + "etypelink", + "noptrbss", + "noptrdata", + "rodata", + "text", +}; + +int +skipsize(char *name) +{ + int i; + + for(i=0; i<nelem(skipnames); i++) + if(strcmp(skipnames[i], name) == 0) + return 1; + return 0; +} + void printsyms(Sym **symptr, long nsym) { @@ -332,12 +363,12 @@ printsyms(Sym **symptr, long nsym) Bprint(&bout, "%*llux ", wid, s->value); else Bprint(&bout, "%*s ", wid, ""); - if(Sflag) { + if(Sflag && !skipsize(cp)) { vlong siz; siz = 0; for(j=i+1; j<nsym; j++) { - if(symptr[j]->type != 'a' && symptr[j]->type != 'p') { + if(!skipsize(symptr[j]->name) && symptr[j]->type != 'a' && symptr[j]->type != 'p') { siz = symptr[j]->value - s->value; break; } |