mirror of
https://github.com/golang/go
synced 2024-11-21 21:04:41 -07:00
cmd/ld: emit relocations for .debug_frame in external link mode
This should have been part of revision 16731:cdedb129e020, but I missed it. This fixes printing local variables when doing an external link. No test because we aren't doing any debug info testing yet. Fixes #5719. R=golang-dev, r CC=golang-dev https://golang.org/cl/13464046
This commit is contained in:
parent
86c0cf10cb
commit
28bbc6c27a
@ -39,6 +39,8 @@ static Sym* infosym;
|
|||||||
static vlong infosympos;
|
static vlong infosympos;
|
||||||
static vlong frameo;
|
static vlong frameo;
|
||||||
static vlong framesize;
|
static vlong framesize;
|
||||||
|
static Sym* framesym;
|
||||||
|
static vlong framesympos;
|
||||||
static vlong pubnameso;
|
static vlong pubnameso;
|
||||||
static vlong pubnamessize;
|
static vlong pubnamessize;
|
||||||
static vlong pubtypeso;
|
static vlong pubtypeso;
|
||||||
@ -60,6 +62,10 @@ static Sym *linesec;
|
|||||||
static vlong linereloco;
|
static vlong linereloco;
|
||||||
static vlong linerelocsize;
|
static vlong linerelocsize;
|
||||||
|
|
||||||
|
static Sym *framesec;
|
||||||
|
static vlong framereloco;
|
||||||
|
static vlong framerelocsize;
|
||||||
|
|
||||||
static char gdbscript[1024];
|
static char gdbscript[1024];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1968,6 +1974,9 @@ writeframes(void)
|
|||||||
Sym *s;
|
Sym *s;
|
||||||
vlong fdeo, fdesize, pad, cfa, pc;
|
vlong fdeo, fdesize, pad, cfa, pc;
|
||||||
|
|
||||||
|
if(framesec == S)
|
||||||
|
framesec = lookup(".dwarfframe", 0);
|
||||||
|
framesec->nr = 0;
|
||||||
frameo = cpos();
|
frameo = cpos();
|
||||||
|
|
||||||
// Emit the CIE, Section 6.4.1
|
// Emit the CIE, Section 6.4.1
|
||||||
@ -2026,8 +2035,14 @@ writeframes(void)
|
|||||||
// Emit the FDE header for real, Section 6.4.1.
|
// Emit the FDE header for real, Section 6.4.1.
|
||||||
cseek(fdeo);
|
cseek(fdeo);
|
||||||
LPUT(fdesize);
|
LPUT(fdesize);
|
||||||
LPUT(0);
|
if(linkmode == LinkExternal) {
|
||||||
addrput(p->pc);
|
adddwarfrel(framesec, framesym, frameo, 4, 0);
|
||||||
|
adddwarfrel(framesec, s, frameo, PtrSize, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LPUT(0);
|
||||||
|
addrput(p->pc);
|
||||||
|
}
|
||||||
addrput(s->size);
|
addrput(s->size);
|
||||||
cseek(fdeo + 4 + fdesize);
|
cseek(fdeo + 4 + fdesize);
|
||||||
}
|
}
|
||||||
@ -2360,6 +2375,10 @@ dwarfemitdebugsections(void)
|
|||||||
linereloco = writedwarfreloc(linesec);
|
linereloco = writedwarfreloc(linesec);
|
||||||
linerelocsize = cpos() - linereloco;
|
linerelocsize = cpos() - linereloco;
|
||||||
align(linerelocsize);
|
align(linerelocsize);
|
||||||
|
|
||||||
|
framereloco = writedwarfreloc(framesec);
|
||||||
|
framerelocsize = cpos() - framereloco;
|
||||||
|
align(framerelocsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2382,6 +2401,7 @@ enum
|
|||||||
ElfStrRelDebugInfo,
|
ElfStrRelDebugInfo,
|
||||||
ElfStrRelDebugAranges,
|
ElfStrRelDebugAranges,
|
||||||
ElfStrRelDebugLine,
|
ElfStrRelDebugLine,
|
||||||
|
ElfStrRelDebugFrame,
|
||||||
NElfStrDbg
|
NElfStrDbg
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2410,10 +2430,12 @@ dwarfaddshstrings(Sym *shstrtab)
|
|||||||
elfstrdbg[ElfStrRelDebugInfo] = addstring(shstrtab, ".rela.debug_info");
|
elfstrdbg[ElfStrRelDebugInfo] = addstring(shstrtab, ".rela.debug_info");
|
||||||
elfstrdbg[ElfStrRelDebugAranges] = addstring(shstrtab, ".rela.debug_aranges");
|
elfstrdbg[ElfStrRelDebugAranges] = addstring(shstrtab, ".rela.debug_aranges");
|
||||||
elfstrdbg[ElfStrRelDebugLine] = addstring(shstrtab, ".rela.debug_line");
|
elfstrdbg[ElfStrRelDebugLine] = addstring(shstrtab, ".rela.debug_line");
|
||||||
|
elfstrdbg[ElfStrRelDebugFrame] = addstring(shstrtab, ".rela.debug_frame");
|
||||||
} else {
|
} else {
|
||||||
elfstrdbg[ElfStrRelDebugInfo] = addstring(shstrtab, ".rel.debug_info");
|
elfstrdbg[ElfStrRelDebugInfo] = addstring(shstrtab, ".rel.debug_info");
|
||||||
elfstrdbg[ElfStrRelDebugAranges] = addstring(shstrtab, ".rel.debug_aranges");
|
elfstrdbg[ElfStrRelDebugAranges] = addstring(shstrtab, ".rel.debug_aranges");
|
||||||
elfstrdbg[ElfStrRelDebugLine] = addstring(shstrtab, ".rel.debug_line");
|
elfstrdbg[ElfStrRelDebugLine] = addstring(shstrtab, ".rel.debug_line");
|
||||||
|
elfstrdbg[ElfStrRelDebugFrame] = addstring(shstrtab, ".rel.debug_frame");
|
||||||
}
|
}
|
||||||
|
|
||||||
infosym = lookup(".debug_info", 0);
|
infosym = lookup(".debug_info", 0);
|
||||||
@ -2424,6 +2446,9 @@ dwarfaddshstrings(Sym *shstrtab)
|
|||||||
|
|
||||||
linesym = lookup(".debug_line", 0);
|
linesym = lookup(".debug_line", 0);
|
||||||
linesym->hide = 1;
|
linesym->hide = 1;
|
||||||
|
|
||||||
|
framesym = lookup(".debug_frame", 0);
|
||||||
|
framesym->hide = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2444,6 +2469,10 @@ dwarfaddelfsectionsyms()
|
|||||||
linesympos = cpos();
|
linesympos = cpos();
|
||||||
putelfsectionsym(linesym, 0);
|
putelfsectionsym(linesym, 0);
|
||||||
}
|
}
|
||||||
|
if(framesym != nil) {
|
||||||
|
framesympos = cpos();
|
||||||
|
putelfsectionsym(framesym, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2469,7 +2498,7 @@ dwarfaddelfrelocheader(int elfstr, ElfShdr *shdata, vlong off, vlong size)
|
|||||||
void
|
void
|
||||||
dwarfaddelfheaders(void)
|
dwarfaddelfheaders(void)
|
||||||
{
|
{
|
||||||
ElfShdr *sh, *shinfo, *sharanges, *shline;
|
ElfShdr *sh, *shinfo, *sharanges, *shline, *shframe;
|
||||||
|
|
||||||
if(debug['w']) // disable dwarf
|
if(debug['w']) // disable dwarf
|
||||||
return;
|
return;
|
||||||
@ -2496,6 +2525,9 @@ dwarfaddelfheaders(void)
|
|||||||
sh->off = frameo;
|
sh->off = frameo;
|
||||||
sh->size = framesize;
|
sh->size = framesize;
|
||||||
sh->addralign = 1;
|
sh->addralign = 1;
|
||||||
|
if(framesympos > 0)
|
||||||
|
putelfsymshndx(framesympos, sh->shnum);
|
||||||
|
shframe = sh;
|
||||||
|
|
||||||
sh = newElfShdr(elfstrdbg[ElfStrDebugInfo]);
|
sh = newElfShdr(elfstrdbg[ElfStrDebugInfo]);
|
||||||
sh->type = SHT_PROGBITS;
|
sh->type = SHT_PROGBITS;
|
||||||
@ -2548,6 +2580,9 @@ dwarfaddelfheaders(void)
|
|||||||
|
|
||||||
if(linerelocsize)
|
if(linerelocsize)
|
||||||
dwarfaddelfrelocheader(ElfStrRelDebugLine, shline, linereloco, linerelocsize);
|
dwarfaddelfrelocheader(ElfStrRelDebugLine, shline, linereloco, linerelocsize);
|
||||||
|
|
||||||
|
if(framerelocsize)
|
||||||
|
dwarfaddelfrelocheader(ElfStrRelDebugFrame, shframe, framereloco, framerelocsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user