diff options
| author | Russ Cox <rsc@golang.org> | 2013-03-19 15:45:42 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2013-03-19 15:45:42 -0400 |
| commit | b4f3533c92dc59f22bbddbc5b73a1575ce6f7f8b (patch) | |
| tree | cc69d632eaae7b8aff08e47c22257ee453b53568 /src/cmd/ld | |
| parent | ab08eac5b78c05672a1bcdc5012f9f9384f86fba (diff) | |
| download | go-b4f3533c92dc59f22bbddbc5b73a1575ce6f7f8b.tar.xz | |
cmd/ld: replace -hostobj with -linkmode
Still disabled. Need to fix TLS.
R=golang-dev, minux.ma, bradfitz
CC=golang-dev
https://golang.org/cl/7783044
Diffstat (limited to 'src/cmd/ld')
| -rw-r--r-- | src/cmd/ld/data.c | 8 | ||||
| -rw-r--r-- | src/cmd/ld/elf.c | 18 | ||||
| -rw-r--r-- | src/cmd/ld/go.c | 25 | ||||
| -rw-r--r-- | src/cmd/ld/lib.h | 1 |
4 files changed, 33 insertions, 19 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c index fdf4d043d5..b70d4636cc 100644 --- a/src/cmd/ld/data.c +++ b/src/cmd/ld/data.c @@ -178,11 +178,11 @@ relocsym(Sym *s) switch(r->type) { default: o = 0; - if(isobj || archreloc(r, s, &o) < 0) + if(linkmode == LinkExternal || archreloc(r, s, &o) < 0) diag("unknown reloc %d", r->type); break; case D_ADDR: - if(isobj && r->sym->type != SCONST) { + if(linkmode == LinkExternal && r->sym->type != SCONST) { r->done = 0; // set up addend for eventual relocation via outer symbol. @@ -212,7 +212,7 @@ relocsym(Sym *s) break; case D_PCREL: // r->sym can be null when CALL $(constant) is transformed from absolute PC to relative PC call. - if(isobj && r->sym && r->sym->type != SCONST && r->sym->sect != cursym->sect) { + if(linkmode == LinkExternal && r->sym && r->sym->type != SCONST && r->sym->sect != cursym->sect) { r->done = 0; // set up addend for eventual relocation via outer symbol. @@ -630,7 +630,7 @@ datblk(int32 addr, int32 size) Bprint(&bso, " %.2ux", 0); Bprint(&bso, "\n"); - if(isobj) { + if(linkmode == LinkExternal) { for(i=0; i<sym->nr; i++) { r = &sym->r[i]; rsname = ""; diff --git a/src/cmd/ld/elf.c b/src/cmd/ld/elf.c index 50711a0ec1..f5cce9c524 100644 --- a/src/cmd/ld/elf.c +++ b/src/cmd/ld/elf.c @@ -758,7 +758,7 @@ elfshbits(Section *sect) sh->flags |= SHF_EXECINSTR; if(sect->rwx & 2) sh->flags |= SHF_WRITE; - if(!isobj) + if(linkmode != LinkExternal) sh->addr = sect->vaddr; sh->addralign = sect->align; sh->size = sect->len; @@ -899,7 +899,7 @@ doelf(void) addstring(shstrtab, ".gosymtab"); addstring(shstrtab, ".gopclntab"); - if(isobj) { + if(linkmode == LinkExternal) { debug['s'] = 0; debug['d'] = 1; @@ -1131,7 +1131,7 @@ asmbelf(vlong symo) resoff = ELFRESERVE; pph = nil; - if(isobj) { + if(linkmode == LinkExternal) { /* skip program headers */ eh->phoff = 0; eh->phentsize = 0; @@ -1392,7 +1392,7 @@ elfobj: for(sect=segdata.sect; sect!=nil; sect=sect->next) elfshbits(sect); - if(isobj) { + if(linkmode == LinkExternal) { for(sect=segtext.sect; sect!=nil; sect=sect->next) elfshreloc(sect); for(sect=segdata.sect; sect!=nil; sect=sect->next) @@ -1415,8 +1415,8 @@ elfobj: sh->size = elfstrsize; sh->addralign = 1; - // TODO(rsc): Enable for isobj too, once we know it works. - if(!isobj) + // TODO(rsc): Enable for linkmode == LinkExternal too, once we know it works. + if(linkmode != LinkExternal) dwarfaddelfheaders(); } @@ -1440,12 +1440,12 @@ elfobj: if(flag_shared) eh->type = ET_DYN; - else if(isobj) + else if(linkmode == LinkExternal) eh->type = ET_REL; else eh->type = ET_EXEC; - if(!isobj) + if(linkmode != LinkExternal) eh->entry = entryvalue(); eh->version = EV_CURRENT; @@ -1462,7 +1462,7 @@ elfobj: a += elfwriteshdrs(); if(!debug['d']) a += elfwriteinterp(); - if(!isobj) { + if(linkmode != LinkExternal) { if(HEADTYPE == Hnetbsd) a += elfwritenetbsdsig(); if(HEADTYPE == Hopenbsd) diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c index ff1f5f437b..f933cbba34 100644 --- a/src/cmd/ld/go.c +++ b/src/cmd/ld/go.c @@ -476,12 +476,10 @@ loadcgo(char *file, char *pkg, char *p, int n) if(strcmp(f[0], "cgo_import_static") == 0) { if(nf != 2) goto err; - if(isobj) { - local = f[1]; - s = lookup(local, 0); - s->type = SHOSTOBJ; - s->size = 0; - } + local = f[1]; + s = lookup(local, 0); + s->type = SHOSTOBJ; + s->size = 0; continue; } @@ -925,3 +923,18 @@ importcycles(void) for(p=pkgall; p; p=p->all) cycle(p); } + +void +setlinkmode(char *arg) +{ + if(strcmp(arg, "internal") == 0) + linkmode = LinkInternal; + else if(strcmp(arg, "external") == 0) + linkmode = LinkExternal; + else if(strcmp(arg, "auto") == 0) + linkmode = LinkAuto; + else { + fprint(2, "unknown link mode -linkmode %s\n", arg); + errorexit(); + } +} diff --git a/src/cmd/ld/lib.h b/src/cmd/ld/lib.h index e5dcdc353c..78232c0759 100644 --- a/src/cmd/ld/lib.h +++ b/src/cmd/ld/lib.h @@ -170,6 +170,7 @@ EXTERN Segment segtext; EXTERN Segment segdata; EXTERN Segment segdwarf; +void setlinkmode(char*); void addlib(char *src, char *obj); void addlibpath(char *srcref, char *objref, char *file, char *pkg); Section* addsection(Segment*, char*, int); |
