summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-09-16 20:27:57 -0400
committerRuss Cox <rsc@golang.org>2013-09-16 20:27:57 -0400
commit6ef10b261c58b240692aba71c0be2e012e65d94b (patch)
tree75e250444756eb18943924060596d2f3249f9e8a /src
parent26400f02c8ce22eff3bdd6d5ca2cfc8dc76e7149 (diff)
downloadgo-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')
-rw-r--r--src/cmd/nm/nm.c35
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;
}