diff options
| author | Devon H. O'Dell <devon.odell@gmail.com> | 2009-11-17 08:20:58 -0800 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2009-11-17 08:20:58 -0800 |
| commit | 0489a260da4e128eddedf38a2eec78ef5da80140 (patch) | |
| tree | cd7048f173aa5c41d4953e4e87e5bc8f08d7b8b4 /src/cmd/6l | |
| parent | 30b1b9a36a2d871e9c1cd6db8b6cc7dab47ba862 (diff) | |
| download | go-0489a260da4e128eddedf38a2eec78ef5da80140.tar.xz | |
FreeBSD-specific porting work.
cgo/libmach remain unimplemented. However, compilers, runtime,
and packages are 100%. I still need to go through and implement
missing syscalls (at least make sure they're all listed), but
for all shipped functionality, this is done. Ship! ;)
R=rsc, VenkateshSrinivas
https://golang.org/cl/152142
Diffstat (limited to 'src/cmd/6l')
| -rw-r--r-- | src/cmd/6l/asm.c | 17 | ||||
| -rw-r--r-- | src/cmd/6l/obj.c | 6 |
2 files changed, 21 insertions, 2 deletions
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index 146245c7bd..a9ff7b47f7 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -38,6 +38,7 @@ #define PADDR(a) ((uint32)(a) & ~0x80000000) char linuxdynld[] = "/lib64/ld-linux-x86-64.so.2"; +char freebsddynld[] = "/libexec/ld-elf.so.1"; char zeroes[32]; @@ -284,7 +285,7 @@ doelf(void) Sym *s, *shstrtab, *dynamic, *dynstr, *d; int h, nsym, t; - if(HEADTYPE != 7) + if(HEADTYPE != 7 && HEADTYPE != 9) return; /* predefine strings we need for section headers */ @@ -317,7 +318,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. @@ -512,6 +520,7 @@ asmb(void) break; case 7: + case 9: debug['8'] = 1; /* 64-bit addresses */ v = rnd(HEADR+textsize, INITRND); seek(cout, v, 0); @@ -565,6 +574,7 @@ asmb(void) symo = rnd(HEADR+textsize, INITRND)+rnd(datsize, INITRND)+machlink; break; case 7: + case 9: symo = rnd(HEADR+textsize, INITRND)+datsize; symo = rnd(symo, INITRND); break; @@ -649,6 +659,7 @@ asmb(void) asmbmacho(symdatva, symo); break; case 7: + case 9: /* elf amd-64 */ eh = getElfEhdr(); @@ -871,6 +882,8 @@ asmb(void) eh->ident[EI_MAG1] = 'E'; eh->ident[EI_MAG2] = 'L'; eh->ident[EI_MAG3] = 'F'; + if(HEADTYPE == 9) + eh->ident[EI_OSABI] = 9; eh->ident[EI_CLASS] = ELFCLASS64; eh->ident[EI_DATA] = ELFDATA2LSB; eh->ident[EI_VERSION] = EV_CURRENT; diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c index ffe93fce4d..63e2f95269 100644 --- a/src/cmd/6l/obj.c +++ b/src/cmd/6l/obj.c @@ -46,6 +46,7 @@ char* paramspace = "FP"; * -H5 -T0x80110000 -R4096 is ELF32 * -H6 -Tx -Rx is apple MH-exec * -H7 -Tx -Rx is linux elf-exec + * -H9 -Tx -Rx is FreeBSD elf-exec * * options used: 189BLQSWabcjlnpsvz */ @@ -149,6 +150,10 @@ main(int argc, char *argv[]) if(strcmp(goos, "darwin") == 0) HEADTYPE = 6; else + if(strcmp(goos, "freebsd") == 0) { + debug['d'] = 1; /* no dynamic syms for now */ + HEADTYPE = 9; + } else print("goos is not known: %s\n", goos); } @@ -194,6 +199,7 @@ main(int argc, char *argv[]) INITDAT = 0; break; case 7: /* elf64 executable */ + case 9: /* freebsd */ elfinit(); HEADR = ELFRESERVE; if(INITTEXT == -1) |
