summaryrefslogtreecommitdiff
path: root/src/cmd/8l/asm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/8l/asm.c')
-rw-r--r--src/cmd/8l/asm.c109
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;