]> Cypherpunks repositories - gostls13.git/commitdiff
6l, 8l: emit macho dwarf info before linkedit section
authorMikkel Krautz <mikkel@krautz.dk>
Tue, 18 Oct 2011 19:58:10 +0000 (15:58 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 18 Oct 2011 19:58:10 +0000 (15:58 -0400)
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5272050

src/cmd/6l/asm.c
src/cmd/8l/asm.c
src/cmd/ld/lib.h
src/cmd/ld/macho.c

index 8d599ef30aa5ac1cf87f618acdd4bdeb7a3fe342..dfb065e51cd9a9f7b16fc2de610db0f3c8b877c1 100644 (file)
@@ -703,7 +703,7 @@ asmb(void)
 {
        int32 magic;
        int a, dynsym;
-       vlong vl, startva, symo, machlink;
+       vlong vl, startva, symo, dwarfoff, machlink;
        ElfEhdr *eh;
        ElfPhdr *ph, *pph;
        ElfShdr *sh;
@@ -738,8 +738,19 @@ asmb(void)
        datblk(segdata.vaddr, segdata.filelen);
 
        machlink = 0;
-       if(HEADTYPE == Hdarwin)
+       if(HEADTYPE == Hdarwin) {
+               if(debug['v'])
+                       Bprint(&bso, "%5.2f dwarf\n", cputime());
+
+               dwarfoff = rnd(HEADR+segtext.len, INITRND) + rnd(segdata.filelen, INITRND);
+               cseek(dwarfoff);
+
+               segdwarf.fileoff = cpos();
+               dwarfemitdebugsections();
+               segdwarf.filelen = cpos() - segdwarf.fileoff;
+
                machlink = domacholink();
+       }
 
        switch(HEADTYPE) {
        default:
@@ -811,7 +822,6 @@ asmb(void)
                                dwarfemitdebugsections();
                        }
                        break;
-               case Hdarwin:
                case Hwindows:
                        if(debug['v'])
                               Bprint(&bso, "%5.2f dwarf\n", cputime());
index 03106386c014fe730e2da4c6bdab9c7b638a3eaa..119c8364b0a24c1228c85e24717314e30683a6e2 100644 (file)
@@ -660,7 +660,7 @@ asmb(void)
 {
        int32 v, magic;
        int a, dynsym;
-       uint32 symo, startva, machlink;
+       uint32 symo, startva, dwarfoff, machlink;
        ElfEhdr *eh;
        ElfPhdr *ph, *pph;
        ElfShdr *sh;
@@ -691,8 +691,19 @@ asmb(void)
        datblk(segdata.vaddr, segdata.filelen);
 
        machlink = 0;
-       if(HEADTYPE == Hdarwin)
+       if(HEADTYPE == Hdarwin) {
+               if(debug['v'])
+                       Bprint(&bso, "%5.2f dwarf\n", cputime());
+
+               dwarfoff = rnd(HEADR+segtext.len, INITRND) + rnd(segdata.filelen, INITRND);
+               cseek(dwarfoff);
+
+               segdwarf.fileoff = cpos();
+               dwarfemitdebugsections();
+               segdwarf.filelen = cpos() - segdwarf.fileoff;
+
                machlink = domacholink();
+       }
 
        if(iself) {
                /* index of elf text section; needed by asmelfsym, double-checked below */
@@ -772,7 +783,6 @@ asmb(void)
                                cflush();
                        }
                        break;
-               case Hdarwin:
                case Hwindows:
                        if(debug['v'])
                                Bprint(&bso, "%5.2f dwarf\n", cputime());
index d13eea31ed8a9aae58c0b1f14309493e9cd9d511..f66eb438f06febc98ac717800dbb0acc22b9e9e7 100644 (file)
@@ -129,6 +129,7 @@ EXTERN      int     havedynamic;
 EXTERN Segment segtext;
 EXTERN Segment segdata;
 EXTERN Segment segsym;
+EXTERN Segment segdwarf;
 
 void   addlib(char *src, char *obj);
 void   addlibpath(char *srcref, char *objref, char *file, char *pkg);
index 70133d66516d4e05060afa3ae9dee958a4e686ee..efcbe0325bdb2c4150b5067a0860580c45f571e8 100644 (file)
@@ -505,7 +505,7 @@ domacholink(void)
        size = s1->size + s2->size + s3->size + s4->size;
 
        if(size > 0) {
-               linkoff = rnd(HEADR+segtext.len, INITRND) + rnd(segdata.filelen, INITRND);
+               linkoff = rnd(HEADR+segtext.len, INITRND) + rnd(segdata.filelen, INITRND) + rnd(segdwarf.filelen, INITRND);
                cseek(linkoff);
 
                cwrite(s1->p, s1->size);