From 0489a260da4e128eddedf38a2eec78ef5da80140 Mon Sep 17 00:00:00 2001 From: "Devon H. O'Dell" Date: Tue, 17 Nov 2009 08:20:58 -0800 Subject: 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 --- src/cmd/6l/asm.c | 17 +++++++++++++++-- src/cmd/6l/obj.c | 6 ++++++ src/cmd/cov/Makefile | 1 + src/cmd/prof/Makefile | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) (limited to 'src/cmd') 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) diff --git a/src/cmd/cov/Makefile b/src/cmd/cov/Makefile index 2d849c6b8a..293ff399a5 100644 --- a/src/cmd/cov/Makefile +++ b/src/cmd/cov/Makefile @@ -24,6 +24,7 @@ clean: install: install-$(shell uname | tr A-Z a-z) install-linux: install-default +install-freebsd: install-default # on Darwin, have to install and setgid; see $GOROOT/src/sudo.bash install-darwin: $(TARG) diff --git a/src/cmd/prof/Makefile b/src/cmd/prof/Makefile index 7ebc19d63f..f9012577ee 100644 --- a/src/cmd/prof/Makefile +++ b/src/cmd/prof/Makefile @@ -24,6 +24,7 @@ clean: install: install-$(shell uname | tr A-Z a-z) install-linux: install-default +install-freebsd: install-default # on Darwin, have to install and setgid; see $GOROOT/src/sudo.bash install-darwin: $(TARG) -- cgit v1.3