diff options
author | Russ Cox <rsc@golang.org> | 2013-03-11 00:51:42 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2013-03-11 00:51:42 -0400 |
commit | 610120697a28d536212b54d3eb90ee42052c7f45 (patch) | |
tree | 4d03f819490de79cca5449627b1745d3c6f58a25 /src/cmd/8l | |
parent | c2e768a069b66d718a2f355cd9ee9a7c589c588b (diff) | |
download | go-610120697a28d536212b54d3eb90ee42052c7f45.tar.gz |
cmd/ld: darwin support for host linking
R=ken2
CC=golang-dev
https://codereview.appspot.com/7626045
Diffstat (limited to 'src/cmd/8l')
-rw-r--r-- | src/cmd/8l/asm.c | 91 | ||||
-rw-r--r-- | src/cmd/8l/obj.c | 3 |
2 files changed, 79 insertions, 15 deletions
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index 9bd04ff1a..402360d70 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -299,6 +299,78 @@ elfreloc1(Reloc *r, vlong sectoff) return 0; } +int +machoreloc1(Reloc *r, vlong sectoff) +{ + uint32 v; + Sym *rs; + + rs = r->xsym; + + if(rs->type == SHOSTOBJ) { + if(rs->dynid < 0) { + diag("reloc %d to non-macho symbol %s type=%d", r->type, rs->name, rs->type); + return -1; + } + v = rs->dynid; + v |= 1<<27; // external relocation + } else { + v = rs->sect->extnum; + if(v == 0) { + diag("reloc %d to symbol %s in non-macho section %s type=%d", r->type, rs->name, rs->sect->name, rs->type); + return -1; + } + } + + switch(r->type) { + default: + return -1; + case D_ADDR: + v |= MACHO_GENERIC_RELOC_VANILLA<<28; + break; + case D_PCREL: + v |= 1<<24; // pc-relative bit + v |= MACHO_GENERIC_RELOC_VANILLA<<28; + break; + } + + switch(r->siz) { + default: + return -1; + case 1: + v |= 0<<25; + break; + case 2: + v |= 1<<25; + break; + case 4: + v |= 2<<25; + break; + case 8: + v |= 3<<25; + break; + } + + LPUT(sectoff); + LPUT(v); + return 0; +} + +int +archreloc(Reloc *r, Sym *s, vlong *val) +{ + USED(s); + switch(r->type) { + case D_CONST: + *val = r->add; + return 0; + case D_GOTOFF: + *val = symaddr(r->sym) + r->add - symaddr(lookup(".got", 0)); + return 0; + } + return -1; +} + void elfsetupplt(void) { @@ -327,21 +399,6 @@ elfsetupplt(void) } } -int -archreloc(Reloc *r, Sym *s, vlong *val) -{ - USED(s); - switch(r->type) { - case D_CONST: - *val = r->add; - return 0; - case D_GOTOFF: - *val = symaddr(r->sym) + r->add - symaddr(lookup(".got", 0)); - return 0; - } - return -1; -} - static void addpltsym(Sym *s) { @@ -636,6 +693,10 @@ asmb(void) Bprint(&bso, "%5.2f dwarf\n", cputime()); dwarfemitdebugsections(); break; + case Hdarwin: + if(isobj) + machoemitreloc(); + break; } } if(debug['v']) diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c index f926652a6..ad453064c 100644 --- a/src/cmd/8l/obj.c +++ b/src/cmd/8l/obj.c @@ -147,8 +147,11 @@ main(int argc, char *argv[]) switch(HEADTYPE) { default: sysfatal("cannot use -hostobj with -H %s", headstr(HEADTYPE)); + case Hdarwin: + case Hfreebsd: case Hlinux: case Hnetbsd: + case Hopenbsd: break; } } |