diff options
| author | Russ Cox <rsc@golang.org> | 2013-03-07 09:19:02 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2013-03-07 09:19:02 -0500 |
| commit | 60f783d92bc07fa7ca78e8efccbbc841d9f9cbcb (patch) | |
| tree | 8677601561fbb007429777514911480aa4c871fd /src/cmd/5l | |
| parent | 8aafb44b0bbba85535feb67e7ae0f4f254524c0f (diff) | |
| download | go-60f783d92bc07fa7ca78e8efccbbc841d9f9cbcb.tar.xz | |
cmd/ld: host linking support for linux/amd64
Still to do: non-linux and non-amd64.
It may work on other ELF-based amd64 systems too, but untested.
"go test -ldflags -hostobj $GOROOT/misc/cgo/test" passes.
Much may yet change, but this seems a reasonable checkpoint.
R=iant
CC=golang-dev
https://golang.org/cl/7369057
Diffstat (limited to 'src/cmd/5l')
| -rw-r--r-- | src/cmd/5l/asm.c | 18 | ||||
| -rw-r--r-- | src/cmd/5l/l.h | 2 | ||||
| -rw-r--r-- | src/cmd/5l/obj.c | 3 |
3 files changed, 13 insertions, 10 deletions
diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c index 04f2a9c6cb..097b74e31b 100644 --- a/src/cmd/5l/asm.c +++ b/src/cmd/5l/asm.c @@ -125,7 +125,7 @@ adddynrel(Sym *s, Reloc *r) // Handle relocations found in ELF object files. case 256 + R_ARM_PLT32: r->type = D_CALL; - if(targ->dynimpname != nil && !targ->dynexport) { + if(targ->dynimpname != nil && !(targ->cgoexport & CgoExportDynamic)) { addpltsym(targ); r->sym = lookup(".plt", 0); r->add = braddoff(r->add, targ->plt / 4); @@ -138,7 +138,7 @@ adddynrel(Sym *s, Reloc *r) return; case 256 + R_ARM_GOT32: // R_ARM_GOT_BREL - if(targ->dynimpname == nil || targ->dynexport) { + if(targ->dynimpname == nil || (targ->cgoexport & CgoExportDynamic)) { addgotsyminternal(targ); } else { addgotsym(targ); @@ -149,7 +149,7 @@ adddynrel(Sym *s, Reloc *r) return; case 256 + R_ARM_GOT_PREL: // GOT(S) + A - P - if(targ->dynimpname == nil || targ->dynexport) { + if(targ->dynimpname == nil || (targ->cgoexport & CgoExportDynamic)) { addgotsyminternal(targ); } else { addgotsym(targ); @@ -171,7 +171,7 @@ adddynrel(Sym *s, Reloc *r) case 256 + R_ARM_CALL: r->type = D_CALL; - if(targ->dynimpname != nil && !targ->dynexport) { + if(targ->dynimpname != nil && !(targ->cgoexport & CgoExportDynamic)) { addpltsym(targ); r->sym = lookup(".plt", 0); r->add = braddoff(r->add, targ->plt / 4); @@ -184,7 +184,7 @@ adddynrel(Sym *s, Reloc *r) return; case 256 + R_ARM_ABS32: - if(targ->dynimpname != nil && !targ->dynexport) + if(targ->dynimpname != nil && !(targ->cgoexport & CgoExportDynamic)) diag("unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ->name); r->type = D_ADDR; return; @@ -201,7 +201,7 @@ adddynrel(Sym *s, Reloc *r) case 256 + R_ARM_PC24: case 256 + R_ARM_JUMP24: r->type = D_CALL; - if(targ->dynimpname != nil && !targ->dynexport) { + if(targ->dynimpname != nil && !(targ->cgoexport & CgoExportDynamic)) { addpltsym(targ); r->sym = lookup(".plt", 0); r->add = braddoff(r->add, targ->plt / 4); @@ -210,7 +210,7 @@ adddynrel(Sym *s, Reloc *r) } // Handle references to ELF symbols from our own object files. - if(targ->dynimpname == nil || targ->dynexport) + if(targ->dynimpname == nil || (targ->cgoexport & CgoExportDynamic)) return; switch(r->type) { @@ -464,7 +464,7 @@ adddynsym(Sym *s) /* type */ t = STB_GLOBAL << 4; - if(s->dynexport && (s->type&SMASK) == STEXT) + if((s->cgoexport & CgoExportDynamic) && (s->type&SMASK) == STEXT) t |= STT_FUNC; else t |= STT_OBJECT; @@ -472,7 +472,7 @@ adddynsym(Sym *s) adduint8(d, 0); /* shndx */ - if(!s->dynexport && s->dynimpname != nil) + if(!(s->cgoexport & CgoExportDynamic) && s->dynimpname != nil) adduint16(d, SHN_UNDEF); else { switch(s->type) { diff --git a/src/cmd/5l/l.h b/src/cmd/5l/l.h index 62dd8947f0..059e269a91 100644 --- a/src/cmd/5l/l.h +++ b/src/cmd/5l/l.h @@ -137,7 +137,7 @@ struct Sym short version; uchar dupok; uchar reachable; - uchar dynexport; + uchar cgoexport; uchar leaf; int32 dynid; int32 plt; diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c index 6aa7fdd69b..58ac77052d 100644 --- a/src/cmd/5l/obj.c +++ b/src/cmd/5l/obj.c @@ -82,6 +82,7 @@ main(int argc, char *argv[]) INITRND = -1; INITENTRY = 0; LIBINITENTRY = 0; + linkmode = LinkInternal; // TODO: LinkAuto once everything works. nuxiinit(); p = getgoarm(); @@ -126,6 +127,7 @@ main(int argc, char *argv[]) flagcount("v", "print link trace", &debug['v']); flagcount("w", "disable DWARF generation", &debug['w']); flagcount("shared", "generate shared object", &flag_shared); + // TODO: link mode flag flagparse(&argc, &argv, usage); @@ -268,6 +270,7 @@ main(int argc, char *argv[]) reloc(); asmb(); undef(); + hostlink(); if(debug['c']) print("ARM size = %d\n", armsize); |
