summaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/8l/asm.c22
-rw-r--r--src/cmd/8l/obj.c14
-rwxr-xr-x[-rw-r--r--]src/cmd/make.bash0
3 files changed, 32 insertions, 4 deletions
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c
index 7f101b74e..e496672e5 100644
--- a/src/cmd/8l/asm.c
+++ b/src/cmd/8l/asm.c
@@ -36,6 +36,7 @@
#define Dbufslop 100
char linuxdynld[] = "/lib/ld-linux.so.2";
+char freebsddynld[] = "/usr/libexec/ld-elf.so.1";
uint32 symdatva = 0x99<<24;
int32
@@ -273,7 +274,7 @@ doelf(void)
Sym *s, *shstrtab, *dynamic, *dynstr, *d;
int h, nsym, t;
- if(HEADTYPE != 7 && HEADTYPE != 8)
+ if(HEADTYPE != 7 && HEADTYPE != 8 && HEADTYPE != 9)
return;
/* predefine strings we need for section headers */
@@ -303,7 +304,14 @@ doelf(void)
s = lookup(".interp", 0);
s->reachable = 1;
s->type = SDATA; // TODO: rodata
- addstring(lookup(".interp", 0), linuxdynld);
+ switch(HEADTYPE) {
+ case 7:
+ addstring(lookup(".interp", 0), linuxdynld);
+ break;
+ case 9:
+ addstring(lookup(".interp", 0), freebsddynld);
+ break;
+ }
/*
* hash table - empty for now.
@@ -527,6 +535,7 @@ asmb(void)
break;
case 7:
case 8:
+ case 9:
v = rnd(HEADR+textsize, INITRND);
seek(cout, v, 0);
break;
@@ -583,6 +592,7 @@ asmb(void)
break;
case 7:
case 8:
+ case 9:
symo = rnd(HEADR+textsize, INITRND)+datsize;
symo = rnd(symo, INITRND);
break;
@@ -752,6 +762,7 @@ asmb(void)
case 7:
case 8:
+ case 9:
/* elf 386 */
if(HEADTYPE == 8)
debug['d'] = 1;
@@ -975,10 +986,15 @@ asmb(void)
eh->ident[EI_CLASS] = ELFCLASS32;
eh->ident[EI_DATA] = ELFDATA2LSB;
eh->ident[EI_VERSION] = EV_CURRENT;
- if(HEADTYPE == 8) {
+ switch(HEADTYPE) {
+ case 8:
eh->ident[EI_OSABI] = ELFOSABI_NACL;
eh->ident[EI_ABIVERSION] = 6;
eh->flags = 0x200000; // aligned mod 32
+ break;
+ case 9:
+ eh->ident[EI_OSABI] = 9;
+ break;
}
eh->type = ET_EXEC;
diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c
index 88925e691..1bfeff5bc 100644
--- a/src/cmd/8l/obj.c
+++ b/src/cmd/8l/obj.c
@@ -49,6 +49,10 @@ char *thestring = "386";
* -H2 -T4128 -R4096 is plan9 format
* -H3 -Tx -Rx is MS-DOS .COM
* -H4 -Tx -Rx is fake MS-DOS .EXE
+ * -H6 -Tx -Rx is Apple Mach-O
+ * -H7 -Tx -Rx is Linux ELF32
+ * -H8 -Tx -Rx is Google Native Client
+ * -H9 -Tx -Rx is FreeBSD ELF32
*/
static int
@@ -154,6 +158,10 @@ main(int argc, char *argv[])
if(strcmp(goos, "nacl") == 0)
HEADTYPE = 8;
else
+ if(strcmp(goos, "freebsd") == 0) {
+ debug['d'] = 1; /* no dynamic syms for now */
+ HEADTYPE = 9;
+ } else
print("goos is not known: %sn", goos);
}
@@ -226,13 +234,17 @@ main(int argc, char *argv[])
INITRND = 4096;
break;
case 7: /* elf32 executable */
+ case 9:
/*
* Linux ELF uses TLS offsets negative from %gs.
* Translate 0(GS) and 4(GS) into -8(GS) and -4(GS).
* Also known to ../../pkg/runtime/linux/386/sys.s
* and ../../libcgo/linux_386.c.
*/
- tlsoffset = -8;
+ if (HEADTYPE == 7)
+ tlsoffset = -8;
+ else
+ tlsoffset = 0;
elfinit();
HEADR = ELFRESERVE;
if(INITTEXT == -1)
diff --git a/src/cmd/make.bash b/src/cmd/make.bash
index db31b7b5a..db31b7b5a 100644..100755
--- a/src/cmd/make.bash
+++ b/src/cmd/make.bash