aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorDevon H. O'Dell <devon.odell@gmail.com>2009-11-17 08:20:58 -0800
committerRuss Cox <rsc@golang.org>2009-11-17 08:20:58 -0800
commit0489a260da4e128eddedf38a2eec78ef5da80140 (patch)
treecd7048f173aa5c41d4953e4e87e5bc8f08d7b8b4 /src/cmd
parent30b1b9a36a2d871e9c1cd6db8b6cc7dab47ba862 (diff)
downloadgo-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')
-rw-r--r--src/cmd/6l/asm.c17
-rw-r--r--src/cmd/6l/obj.c6
-rw-r--r--src/cmd/cov/Makefile1
-rw-r--r--src/cmd/prof/Makefile1
4 files changed, 23 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)
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)