diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index af615e6938..256213fe2f 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -929,7 +929,7 @@ asmb(void) sh->size = elfstrsize; sh->addralign = 1; - dwarfaddheaders(); + dwarfaddelfheaders(); } sh = newElfShstrtab(elfstr[ElfStrShstrtab]); diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index 277fba37ab..f110f60176 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -1050,7 +1050,7 @@ asmb(void) sh->addralign = 1; sh->addr = symdatva + 8 + symsize; - dwarfaddheaders(); + dwarfaddelfheaders(); } sh = newElfShstrtab(elfstr[ElfStrShstrtab]); diff --git a/src/cmd/ld/dwarf.c b/src/cmd/ld/dwarf.c index e889ef739b..c321728dd2 100644 --- a/src/cmd/ld/dwarf.c +++ b/src/cmd/ld/dwarf.c @@ -7,6 +7,7 @@ #include "../ld/dwarf.h" #include "../ld/dwarf_defs.h" #include "../ld/elf.h" +#include "../ld/macho.h" /* * Offsets and sizes of the .debug_* sections in the cout file. @@ -835,7 +836,7 @@ dwarfemitdebugsections(void) } void -dwarfaddheaders(void) +dwarfaddelfheaders(void) { ElfShdr *sh; @@ -857,3 +858,32 @@ dwarfaddheaders(void) sh->size = infosize; sh->addralign = 1; } + +void +dwarfaddmachoheaders(void) +{ + MachoSect *msect; + MachoSeg *ms; + + vlong fakestart; + + // Zero vsize segments won't be loaded in memory, even so they + // have to be page aligned in the file. + fakestart = abbrevo & ~0xfff; + + ms = newMachoSeg("__DWARF", 3); + ms->fileoffset = fakestart; + ms->filesize = abbrevo-fakestart + abbrevsize+linesize+infosize; + + msect = newMachoSect(ms, "__debug_abbrev"); + msect->off = abbrevo; + msect->size = abbrevsize; + + msect = newMachoSect(ms, "__debug_line"); + msect->off = lineo; + msect->size = linesize; + + msect = newMachoSect(ms, "__debug_info"); + msect->off = infoo; + msect->size = infosize; +} diff --git a/src/cmd/ld/dwarf.h b/src/cmd/ld/dwarf.h index fae38af0ac..928aedd413 100644 --- a/src/cmd/ld/dwarf.h +++ b/src/cmd/ld/dwarf.h @@ -22,7 +22,8 @@ void dwarfaddshstrings(Sym *shstrtab); void dwarfemitdebugsections(void); /* - * Add ELF section headers pointing to the sections emitted in + * Add section headers pointing to the sections emitted in * dwarfemitdebugsections. */ -void dwarfaddheaders(void); +void dwarfaddelfheaders(void); +void dwarfaddmachoheaders(void); diff --git a/src/cmd/ld/macho.c b/src/cmd/ld/macho.c index 24400cf14c..e081053c15 100644 --- a/src/cmd/ld/macho.c +++ b/src/cmd/ld/macho.c @@ -6,6 +6,7 @@ // http://developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html #include "l.h" +#include "../ld/dwarf.h" #include "../ld/lib.h" #include "../ld/macho.h" @@ -129,7 +130,7 @@ machowrite(void) MachoDebug *d; MachoLoad *l; - o1 = Boffset(&bso); + o1 = cpos(); loadsize = 4*4*ndebug; for(i=0; ifilesize); } - return Boffset(&bso) - o1; + return cpos() - o1; } static void* @@ -617,6 +618,8 @@ asmbmacho(vlong symdatva, vlong symo) md = newMachoDebug(); md->fileoffset = symo+8+symsize; md->filesize = lcsize; + + dwarfaddmachoheaders(); } a = machowrite();