1
0
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:
Ian Lance Taylor 2013-09-05 12:55:21 -07:00
parent 86c0cf10cb
commit 28bbc6c27a

View File

@ -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);
} }
/* /*