aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-03-10 18:19:53 -0400
committerRuss Cox <rsc@golang.org>2013-03-10 18:19:53 -0400
commit96b243fa47d64e0e9538222e114efe53f86ba184 (patch)
tree7117ecb6a3a5c8d1da0eebcd8881db7517971040 /src/cmd/ld
parent4c40e5ae51a3a8ba76ffae04b394523e154fe1b7 (diff)
downloadgo-96b243fa47d64e0e9538222e114efe53f86ba184.tar.xz
cmd/ld: replace dynimpname with extname
Dynimpname was getting too confusing. Replace flag-like checks with tests of s->type. R=ken2 CC=golang-dev https://golang.org/cl/7594046
Diffstat (limited to 'src/cmd/ld')
-rw-r--r--src/cmd/ld/data.c2
-rw-r--r--src/cmd/ld/elf.c4
-rw-r--r--src/cmd/ld/go.c18
-rw-r--r--src/cmd/ld/ldelf.c4
-rw-r--r--src/cmd/ld/ldmacho.c4
-rw-r--r--src/cmd/ld/lib.c1
-rw-r--r--src/cmd/ld/macho.c14
-rw-r--r--src/cmd/ld/pe.c14
8 files changed, 24 insertions, 37 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 3e4e4bf6d9..e035942be7 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -297,7 +297,7 @@ dynrelocsym(Sym *s)
for(r=s->r; r<s->r+s->nr; r++) {
if(r->sym != S && r->sym->type == SDYNIMPORT || r->type >= 256)
adddynrel(s, r);
- if(flag_shared && r->sym != S && (r->sym->dynimpname == nil || (r->sym->cgoexport & CgoExportDynamic)) && r->type == D_ADDR
+ if(flag_shared && r->sym != S && s->type != SDYNIMPORT && r->type == D_ADDR
&& (s == got || s->type == SDATA || s->type == SGOSTRING || s->type == STYPE || s->type == SRODATA)) {
// Create address based RELATIVE relocation
adddynrela(rel, s, r);
diff --git a/src/cmd/ld/elf.c b/src/cmd/ld/elf.c
index 0bd23d8ed0..9f7cb75fa9 100644
--- a/src/cmd/ld/elf.c
+++ b/src/cmd/ld/elf.c
@@ -605,9 +605,7 @@ elfdynhash(void)
if(sy->dynimpvers)
need[sy->dynid] = addelflib(&needlib, sy->dynimplib, sy->dynimpvers);
- name = sy->dynimpname;
- if(name == nil)
- name = sy->name;
+ name = sy->extname;
hc = elfhash((uchar*)name);
b = hc % nbucket;
diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c
index 246d73c23f..66eddd5d8d 100644
--- a/src/cmd/ld/go.c
+++ b/src/cmd/ld/go.c
@@ -465,7 +465,7 @@ loadcgo(char *file, char *pkg, char *p, int n)
free(local);
if(s->type == 0 || s->type == SXREF) {
s->dynimplib = lib;
- s->dynimpname = remote;
+ s->extname = remote;
s->dynimpvers = q;
s->type = SDYNIMPORT;
havedynamic = 1;
@@ -507,17 +507,17 @@ loadcgo(char *file, char *pkg, char *p, int n)
nerrors++;
}
- if(strcmp(f[0], "cgo_export_static") == 0)
- s->cgoexport |= CgoExportStatic;
- else
- s->cgoexport |= CgoExportDynamic;
- if(s->dynimpname == nil) {
- s->dynimpname = remote;
+ if(s->cgoexport == 0) {
+ if(strcmp(f[0], "cgo_export_static") == 0)
+ s->cgoexport |= CgoExportStatic;
+ else
+ s->cgoexport |= CgoExportDynamic;
+ s->extname = remote;
if(ndynexp%32 == 0)
dynexp = erealloc(dynexp, (ndynexp+32)*sizeof dynexp[0]);
dynexp[ndynexp++] = s;
- } else if(strcmp(s->dynimpname, remote) != 0) {
- fprint(2, "%s: conflicting cgo_export directives: %s as %s and %s\n", argv0, s->name, s->dynimpname, remote);
+ } else if(strcmp(s->extname, remote) != 0) {
+ fprint(2, "%s: conflicting cgo_export directives: %s as %s and %s\n", argv0, s->name, s->extname, remote);
nerrors++;
return;
}
diff --git a/src/cmd/ld/ldelf.c b/src/cmd/ld/ldelf.c
index 750dff4e60..27041bc472 100644
--- a/src/cmd/ld/ldelf.c
+++ b/src/cmd/ld/ldelf.c
@@ -595,10 +595,8 @@ ldelf(Biobuf *f, char *pkg, int64 len, char *pn)
s->sub = sect->sym->sub;
sect->sym->sub = s;
s->type = sect->sym->type | (s->type&~SMASK) | SSUB;
- if(!(s->cgoexport & CgoExportDynamic)) {
+ if(!(s->cgoexport & CgoExportDynamic))
s->dynimplib = nil; // satisfy dynimport
- s->dynimpname = nil; // satisfy dynimport
- }
s->value = sym.value;
s->size = sym.size;
s->outer = sect->sym;
diff --git a/src/cmd/ld/ldmacho.c b/src/cmd/ld/ldmacho.c
index 2509be471c..098cb7beff 100644
--- a/src/cmd/ld/ldmacho.c
+++ b/src/cmd/ld/ldmacho.c
@@ -639,10 +639,8 @@ ldmacho(Biobuf *f, char *pkg, int64 len, char *pn)
s->size = (sym+1)->value - sym->value;
else
s->size = sect->addr + sect->size - sym->value;
- if(!(s->cgoexport & CgoExportDynamic)) {
+ if(!(s->cgoexport & CgoExportDynamic))
s->dynimplib = nil; // satisfy dynimport
- s->dynimpname = nil; // satisfy dynimport
- }
if(outer->type == STEXT) {
Prog *p;
diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c
index 5468c7b0e7..82a7df341a 100644
--- a/src/cmd/ld/lib.c
+++ b/src/cmd/ld/lib.c
@@ -843,6 +843,7 @@ _lookup(char *symb, int v, int creat)
return nil;
s = newsym(symb, v);
+ s->extname = s->name;
s->hash = hash[h];
hash[h] = s;
diff --git a/src/cmd/ld/macho.c b/src/cmd/ld/macho.c
index be85bf8093..b85b7d6d8b 100644
--- a/src/cmd/ld/macho.c
+++ b/src/cmd/ld/macho.c
@@ -458,7 +458,7 @@ symkind(Sym *s)
{
if(s->type == SDYNIMPORT)
return SymKindUndef;
- if(s->dynimpname)
+ if(s->cgoexport)
return SymKindExtdef;
return SymKindLocal;
}
@@ -490,14 +490,6 @@ addsym(Sym *s, char *name, int type, vlong addr, vlong size, int ver, Sym *gotyp
}
nsortsym++;
}
-
-static char*
-xsymname(Sym *s)
-{
- if(s->dynimpname != nil)
- return s->dynimpname;
- return s->name;
-}
static int
scmp(const void *p1, const void *p2)
@@ -513,7 +505,7 @@ scmp(const void *p1, const void *p2)
if(k1 != k2)
return k1 - k2;
- return strcmp(xsymname(s1), xsymname(s2));
+ return strcmp(s1->extname, s2->extname);
}
static void
@@ -559,7 +551,7 @@ machosymtab(void)
s = sortsym[i];
adduint32(symtab, symstr->size);
adduint8(symstr, '_');
- addstring(symstr, xsymname(s));
+ addstring(symstr, s->extname);
if(s->type == SDYNIMPORT) {
adduint8(symtab, 0x01); // type N_EXT, external symbol
adduint8(symtab, 0); // no section
diff --git a/src/cmd/ld/pe.c b/src/cmd/ld/pe.c
index 85f622dbc0..090d083f5d 100644
--- a/src/cmd/ld/pe.c
+++ b/src/cmd/ld/pe.c
@@ -195,7 +195,7 @@ initdynimport(void)
dr = nil;
m = nil;
for(s = allsym; s != S; s = s->allsym) {
- if(!s->reachable || !s->dynimpname || (s->cgoexport & CgoExportDynamic))
+ if(!s->reachable || s->type != SDYNIMPORT)
continue;
for(d = dr; d != nil; d = d->next) {
if(strcmp(d->name,s->dynimplib) == 0) {
@@ -262,7 +262,7 @@ addimports(IMAGE_SECTION_HEADER *datsect)
for(m = d->ms; m != nil; m = m->next) {
m->off = nextsectoff + cpos() - startoff;
wputl(0); // hint
- strput(m->s->dynimpname);
+ strput(m->s->extname);
}
}
@@ -325,7 +325,7 @@ scmp(const void *p1, const void *p2)
s1 = *(Sym**)p1;
s2 = *(Sym**)p2;
- return strcmp(s1->dynimpname, s2->dynimpname);
+ return strcmp(s1->extname, s2->extname);
}
static void
@@ -335,7 +335,7 @@ initdynexport(void)
nexport = 0;
for(s = allsym; s != S; s = s->allsym) {
- if(!s->reachable || !s->dynimpname || !(s->cgoexport & CgoExportDynamic))
+ if(!s->reachable || !(s->cgoexport & CgoExportDynamic))
continue;
if(nexport+1 > sizeof(dexport)/sizeof(dexport[0])) {
diag("pe dynexport table is full");
@@ -358,7 +358,7 @@ addexports(void)
size = sizeof e + 10*nexport + strlen(outfile) + 1;
for(i=0; i<nexport; i++)
- size += strlen(dexport[i]->dynimpname) + 1;
+ size += strlen(dexport[i]->extname) + 1;
if (nexport == 0)
return;
@@ -394,7 +394,7 @@ addexports(void)
v = e.Name + strlen(outfile)+1;
for(i=0; i<nexport; i++) {
lputl(v);
- v += strlen(dexport[i]->dynimpname)+1;
+ v += strlen(dexport[i]->extname)+1;
}
// put EXPORT Ordinal Table
for(i=0; i<nexport; i++)
@@ -402,7 +402,7 @@ addexports(void)
// put Names
strnput(outfile, strlen(outfile)+1);
for(i=0; i<nexport; i++)
- strnput(dexport[i]->dynimpname, strlen(dexport[i]->dynimpname)+1);
+ strnput(dexport[i]->extname, strlen(dexport[i]->extname)+1);
strnput("", sect->SizeOfRawData - size);
}