summaryrefslogtreecommitdiff
path: root/src/cmd/ld
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2014-05-06 11:40:43 +1000
committerAlex Brainman <alex.brainman@gmail.com>2014-05-06 11:40:43 +1000
commit43e452cc7b0f7b335488c0ca012546ede77d026b (patch)
treebee01a4b1b1abe8eff89d36a729d77f1c270268b /src/cmd/ld
parent3aa473f7f47f5253ac432706d0a9cbf2ec9caf42 (diff)
downloadgo-43e452cc7b0f7b335488c0ca012546ede77d026b.tar.gz
cmd/ld: correct pe section number in symbol table
Update issue 7899 LGTM=iant R=golang-codereviews, rsc, iant CC=golang-codereviews https://codereview.appspot.com/97920044
Diffstat (limited to 'src/cmd/ld')
-rw-r--r--src/cmd/ld/pe.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/cmd/ld/pe.c b/src/cmd/ld/pe.c
index 27c557436..c26cd5264 100644
--- a/src/cmd/ld/pe.c
+++ b/src/cmd/ld/pe.c
@@ -84,6 +84,7 @@ struct COFFSym
LSym* sym;
int strtbloff;
int sect;
+ vlong value;
};
static COFFSym* coffsym;
@@ -476,6 +477,7 @@ newPEDWARFSection(char *name, vlong size)
static void
addsym(LSym *s, char *name, int type, vlong addr, vlong size, int ver, LSym *gotype)
{
+ COFFSym *cs;
USED(name);
USED(addr);
USED(size);
@@ -498,28 +500,25 @@ addsym(LSym *s, char *name, int type, vlong addr, vlong size, int ver, LSym *got
}
if(coffsym) {
- coffsym[ncoffsym].sym = s;
+ cs = &coffsym[ncoffsym];
+ cs->sym = s;
if(strlen(s->name) > 8)
- coffsym[ncoffsym].strtbloff = strtbladd(s->name);
- if(type == 'T')
- coffsym[ncoffsym].sect = textsect;
- else
- coffsym[ncoffsym].sect = datasect;
+ cs->strtbloff = strtbladd(s->name);
+ if(s->value >= segdata.vaddr) {
+ cs->value = s->value - segdata.vaddr;
+ cs->sect = datasect;
+ } else if(s->value >= segtext.vaddr) {
+ cs->value = s->value - segtext.vaddr;
+ cs->sect = textsect;
+ } else {
+ cs->value = 0;
+ cs->sect = 0;
+ diag("addsym %#llx", addr);
+ }
}
ncoffsym++;
}
-static vlong
-datoffsect(vlong addr)
-{
- if(addr >= segdata.vaddr)
- return addr - segdata.vaddr;
- if(addr >= segtext.vaddr)
- return addr - segtext.vaddr;
- diag("datoff %#llx", addr);
- return 0;
-}
-
static void
addsymtable(void)
{
@@ -551,7 +550,7 @@ addsymtable(void)
lputl(0);
lputl(s->strtbloff);
}
- lputl(datoffsect(s->sym->value));
+ lputl(s->value);
wputl(s->sect);
wputl(0x0308); // "array of structs"
cput(2); // storage class: external