diff options
Diffstat (limited to 'src/cmd')
-rw-r--r-- | src/cmd/8l/asm.c | 22 | ||||
-rw-r--r-- | src/cmd/8l/obj.c | 14 | ||||
-rwxr-xr-x[-rw-r--r--] | src/cmd/make.bash | 0 |
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 |