diff options
Diffstat (limited to 'src/cmd/8l/asm.c')
-rw-r--r-- | src/cmd/8l/asm.c | 109 |
1 files changed, 22 insertions, 87 deletions
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index 449467a5c..c70af7072 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -257,7 +257,7 @@ needlib(char *name) Sym *s; /* reuse hash code in symbol table */ - p = smprint(".elfload.%s", name); + p = smprint(".dynlib.%s", name); s = lookup(p, 0); if(s->type == 0) { s->type = 100; // avoid SDATA, etc. @@ -414,8 +414,8 @@ asmb(void) { Prog *p; int32 v, magic; - int a, dynsym; - uint32 va, fo, w, symo, startva; + int a, i, dynsym; + uint32 va, fo, w, symo, startva, machlink; uchar *op1; ulong expectpc; ElfEhdr *eh; @@ -547,6 +547,10 @@ asmb(void) datblk(v, datsize-v); } + machlink = 0; + if(HEADTYPE == 6) + machlink = domacholink(); + symsize = 0; spsize = 0; lcsize = 0; @@ -572,7 +576,7 @@ asmb(void) symo = HEADR+textsize+datsize; break; case 6: - symo = rnd(HEADR+textsize, INITRND)+rnd(datsize, INITRND); + symo = rnd(HEADR+textsize, INITRND)+rnd(datsize, INITRND)+machlink; break; case 7: case 8: @@ -740,89 +744,7 @@ asmb(void) break; case 6: - /* apple MACH */ - va = HEADR; - mh = getMachoHdr(); - mh->cpu = MACHO_CPU_386; - mh->subcpu = MACHO_SUBCPU_X86; - - /* segment for zero page */ - ms = newMachoSeg("__PAGEZERO", 0); - ms->vsize = va; - - /* text */ - v = rnd(HEADR+textsize, INITRND); - ms = newMachoSeg("__TEXT", 1); - ms->vaddr = va; - ms->vsize = v; - ms->filesize = v; - ms->prot1 = 7; - ms->prot2 = 5; - - msect = newMachoSect(ms, "__text"); - msect->addr = va+HEADR; - msect->size = v - HEADR; - msect->off = HEADR; - msect->flag = 0x400; /* flag - some instructions */ - - /* data */ - w = datsize+bsssize; - ms = newMachoSeg("__DATA", 2); - ms->vaddr = va+v; - ms->vsize = w; - ms->fileoffset = v; - ms->filesize = datsize; - ms->prot1 = 7; - ms->prot2 = 3; - - msect = newMachoSect(ms, "__data"); - msect->addr = va+v; - msect->size = datsize; - msect->off = v; - - msect = newMachoSect(ms, "__bss"); - msect->addr = va+v+datsize; - msect->size = bsssize; - msect->flag = 1; /* flag - zero fill */ - - ml = newMachoLoad(5, 16+2); /* unix thread */ - ml->data[0] = 1; /* thread type */ - ml->data[1] = 16; /* word count */ - ml->data[2+10] = entryvalue(); /* start pc */ - - if(!debug['d']) { - ml = newMachoLoad(2, 4); /* LC_SYMTAB */ - USED(ml); - - ml = newMachoLoad(11, 18); /* LC_DYSYMTAB */ - USED(ml); - - ml = newMachoLoad(14, 6); /* LC_LOAD_DYLINKER */ - ml->data[0] = 12; /* offset to string */ - strcpy((char*)&ml->data[1], "/usr/lib/dyld"); - } - - if(!debug['s']) { - ms = newMachoSeg("__SYMDAT", 1); - ms->vaddr = symdatva; - ms->vsize = 8+symsize+lcsize; - ms->fileoffset = symo; - ms->filesize = 8+symsize+lcsize; - ms->prot1 = 7; - ms->prot2 = 5; - - md = newMachoDebug(); - md->fileoffset = symo+8; - md->filesize = symsize; - - md = newMachoDebug(); - md->fileoffset = symo+8+symsize; - md->filesize = lcsize; - } - - a = machowrite(); - if(a > MACHORESERVE) - diag("MACHORESERVE too small: %d > %d", a, MACHORESERVE); + asmbmacho(symdatva, symo); break; case 7: @@ -963,6 +885,17 @@ asmb(void) ph->type = PT_DYNAMIC; ph->flags = PF_R + PF_W; phsh(ph, sh); + + /* + * Thread-local storage segment (really just size). + */ + if(tlsoffset != 0) { + ph = newElfPhdr(); + ph->type = PT_TLS; + ph->flags = PF_R; + ph->memsz = -tlsoffset; + ph->align = 4; + } } ph = newElfPhdr(); @@ -1105,6 +1038,8 @@ datblk(int32 s, int32 n) curp = p; if(!p->from.sym->reachable) diag("unreachable symbol in datblk - %s", p->from.sym->name); + if(p->from.sym->type == SMACHO) + continue; l = p->from.sym->value + p->from.offset - s; c = p->from.scale; i = 0; |