aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2012-02-22 01:30:04 -0500
committerRuss Cox <rsc@golang.org>2012-02-22 01:30:04 -0500
commitc2cd0d09c2e784fb818aea47557269a3bac9d8b1 (patch)
tree681b881263d263a797688b98a9d5aae515fddcb9
parente29d3dfc49f7142d87ab71bd1d8d04e129972dd5 (diff)
downloadgo-c2cd0d09c2e784fb818aea47557269a3bac9d8b1.tar.gz
go-c2cd0d09c2e784fb818aea47557269a3bac9d8b1.zip
ld: get symbol table letters right
Have to assign them before we create the symbol table. ARM debugging. TBR=r CC=golang-dev https://golang.org/cl/5689067
-rw-r--r--src/cmd/5l/asm.c4
-rw-r--r--src/cmd/6l/asm.c4
-rw-r--r--src/cmd/8l/asm.c2
-rw-r--r--src/cmd/ld/data.c40
-rw-r--r--src/cmd/ld/lib.h1
-rw-r--r--src/cmd/ld/symtab.c14
6 files changed, 44 insertions, 21 deletions
diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c
index 5edc27011a..b36a982d1b 100644
--- a/src/cmd/5l/asm.c
+++ b/src/cmd/5l/asm.c
@@ -1850,6 +1850,8 @@ genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*))
case SSTRING:
case SGOSTRING:
case SNOPTRDATA:
+ case SSYMTAB:
+ case SPCLNTAB:
if(!s->reachable)
continue;
put(s, s->name, 'D', s->value, s->size, s->version, s->gotype);
@@ -1859,6 +1861,8 @@ genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*))
case SNOPTRBSS:
if(!s->reachable)
continue;
+ if(s->np > 0)
+ diag("%s should not be bss (size=%d type=%d special=%d)", s->name, (int)s->np, s->type, s->special);
put(s, s->name, 'B', s->value, s->size, s->version, s->gotype);
continue;
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c
index d5954ea517..ee31a05cdc 100644
--- a/src/cmd/6l/asm.c
+++ b/src/cmd/6l/asm.c
@@ -1170,6 +1170,8 @@ genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*))
switch(s->type&~SSUB) {
case SCONST:
case SRODATA:
+ case SSYMTAB:
+ case SPCLNTAB:
case SDATA:
case SNOPTRDATA:
case SELFROSECT:
@@ -1187,6 +1189,8 @@ genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*))
case SNOPTRBSS:
if(!s->reachable)
continue;
+ if(s->np > 0)
+ diag("%s should not be bss (size=%d type=%d special=%d)", s->name, (int)s->np, s->type, s->special);
put(s, s->name, 'B', symaddr(s), s->size, s->version, s->gotype);
continue;
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c
index 2b8137fb3a..25ffc786fc 100644
--- a/src/cmd/8l/asm.c
+++ b/src/cmd/8l/asm.c
@@ -1259,6 +1259,8 @@ genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*))
case SGOSTRING:
case SWINDOWS:
case SNOPTRDATA:
+ case SSYMTAB:
+ case SPCLNTAB:
if(!s->reachable)
continue;
put(s, s->name, 'D', symaddr(s), s->size, s->version, s->gotype);
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 5ed8568ff3..397ae83b23 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -414,13 +414,13 @@ savedata(Sym *s, Prog *p, char *pn)
}
static void
-blk(Sym *allsym, int32 addr, int32 size)
+blk(Sym *start, int32 addr, int32 size)
{
Sym *sym;
int32 eaddr;
uchar *p, *ep;
- for(sym = allsym; sym != nil; sym = sym->next)
+ for(sym = start; sym != nil; sym = sym->next)
if(!(sym->type&SSUB) && sym->value >= addr)
break;
@@ -779,6 +779,21 @@ addsize(Sym *s, Sym *t)
}
void
+dosymtype(void)
+{
+ Sym *s;
+
+ for(s = allsym; s != nil; s = s->allsym) {
+ if(s->np > 0) {
+ if(s->type == SBSS)
+ s->type = SDATA;
+ if(s->type == SNOPTRBSS)
+ s->type = SNOPTRDATA;
+ }
+ }
+}
+
+void
dodata(void)
{
int32 t, datsize;
@@ -806,17 +821,12 @@ dodata(void)
}
for(s = datap; s != nil; s = s->next) {
- if(s->np > 0) {
- if(s->type == SBSS)
- s->type = SDATA;
- if(s->type == SNOPTRBSS)
- s->type = SNOPTRDATA;
- }
if(s->np > s->size)
diag("%s: initialize bounds (%lld < %d)",
s->name, (vlong)s->size, s->np);
}
-
+
+
/*
* now that we have the datap list, but before we start
* to assign addresses, record all the necessary
@@ -1088,13 +1098,13 @@ address(void)
xdefine("esymtab", SRODATA, symtab->vaddr + symtab->len);
xdefine("pclntab", SRODATA, pclntab->vaddr);
xdefine("epclntab", SRODATA, pclntab->vaddr + pclntab->len);
- xdefine("noptrdata", SBSS, noptr->vaddr);
- xdefine("enoptrdata", SBSS, noptr->vaddr + noptr->len);
+ xdefine("noptrdata", SNOPTRDATA, noptr->vaddr);
+ xdefine("enoptrdata", SNOPTRDATA, noptr->vaddr + noptr->len);
xdefine("bss", SBSS, bss->vaddr);
xdefine("ebss", SBSS, bss->vaddr + bss->len);
- xdefine("data", SBSS, data->vaddr);
- xdefine("edata", SBSS, data->vaddr + data->len);
- xdefine("noptrbss", SBSS, noptrbss->vaddr);
- xdefine("enoptrbss", SBSS, noptrbss->vaddr + noptrbss->len);
+ xdefine("data", SDATA, data->vaddr);
+ xdefine("edata", SDATA, data->vaddr + data->len);
+ xdefine("noptrbss", SNOPTRBSS, noptrbss->vaddr);
+ xdefine("enoptrbss", SNOPTRBSS, noptrbss->vaddr + noptrbss->len);
xdefine("end", SBSS, segdata.vaddr + segdata.len);
}
diff --git a/src/cmd/ld/lib.h b/src/cmd/ld/lib.h
index f5881b5d6f..9e39c74703 100644
--- a/src/cmd/ld/lib.h
+++ b/src/cmd/ld/lib.h
@@ -196,6 +196,7 @@ void asmelfsym(void);
void asmplan9sym(void);
void strnput(char*, int);
void dodata(void);
+void dosymtype(void);
void address(void);
void textaddress(void);
void genasmsym(void (*put)(Sym*, char*, int, vlong, vlong, int, Sym*));
diff --git a/src/cmd/ld/symtab.c b/src/cmd/ld/symtab.c
index 6d76e9e775..129b13ea08 100644
--- a/src/cmd/ld/symtab.c
+++ b/src/cmd/ld/symtab.c
@@ -324,20 +324,22 @@ symtab(void)
{
Sym *s;
+ dosymtype();
+
// Define these so that they'll get put into the symbol table.
// data.c:/^address will provide the actual values.
xdefine("text", STEXT, 0);
xdefine("etext", STEXT, 0);
xdefine("rodata", SRODATA, 0);
xdefine("erodata", SRODATA, 0);
- xdefine("noptrdata", SBSS, 0);
- xdefine("enoptrdata", SBSS, 0);
- xdefine("data", SBSS, 0);
- xdefine("edata", SBSS, 0);
+ xdefine("noptrdata", SNOPTRDATA, 0);
+ xdefine("enoptrdata", SNOPTRDATA, 0);
+ xdefine("data", SDATA, 0);
+ xdefine("edata", SDATA, 0);
xdefine("bss", SBSS, 0);
xdefine("ebss", SBSS, 0);
- xdefine("noptrbss", SBSS, 0);
- xdefine("enoptrbss", SBSS, 0);
+ xdefine("noptrbss", SNOPTRBSS, 0);
+ xdefine("enoptrbss", SNOPTRBSS, 0);
xdefine("end", SBSS, 0);
xdefine("epclntab", SRODATA, 0);
xdefine("esymtab", SRODATA, 0);