aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-03-19 15:45:42 -0400
committerRuss Cox <rsc@golang.org>2013-03-19 15:45:42 -0400
commitb4f3533c92dc59f22bbddbc5b73a1575ce6f7f8b (patch)
treecc69d632eaae7b8aff08e47c22257ee453b53568 /src/cmd/ld
parentab08eac5b78c05672a1bcdc5012f9f9384f86fba (diff)
downloadgo-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.c8
-rw-r--r--src/cmd/ld/elf.c18
-rw-r--r--src/cmd/ld/go.c25
-rw-r--r--src/cmd/ld/lib.h1
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);