summaryrefslogtreecommitdiff
path: root/src/cmd/5l
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
commit1bf689a16154f8005d73896783e6e714ba9a1479 (patch)
tree67e36fbae246c382c6cc34eb2950ae2ca93195b8 /src/cmd/5l
parentcd65be6085d94bc93514854c8d609871c5fa9376 (diff)
downloadgo-1bf689a16154f8005d73896783e6e714ba9a1479.tar.gz
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://codereview.appspot.com/7594046
Diffstat (limited to 'src/cmd/5l')
-rw-r--r--src/cmd/5l/asm.c25
-rw-r--r--src/cmd/5l/l.h2
2 files changed, 10 insertions, 17 deletions
diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c
index 097b74e31..4afbedfc4 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->cgoexport & CgoExportDynamic)) {
+ if(targ->type == SDYNIMPORT) {
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->cgoexport & CgoExportDynamic)) {
+ if(targ->type != SDYNIMPORT) {
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->cgoexport & CgoExportDynamic)) {
+ if(targ->type != SDYNIMPORT) {
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->cgoexport & CgoExportDynamic)) {
+ if(targ->type == SDYNIMPORT) {
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->cgoexport & CgoExportDynamic))
+ if(targ->type == SDYNIMPORT)
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->cgoexport & CgoExportDynamic)) {
+ if(targ->type == SDYNIMPORT) {
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->cgoexport & CgoExportDynamic))
+ if(targ->type != SDYNIMPORT)
return;
switch(r->type) {
@@ -437,20 +437,13 @@ adddynsym(Sym *s)
if(s->dynid >= 0)
return;
- if(s->dynimpname == nil) {
- s->dynimpname = s->name;
- //diag("adddynsym: no dynamic name for %s", s->name);
- }
-
if(iself) {
s->dynid = nelfsym++;
d = lookup(".dynsym", 0);
/* name */
- name = s->dynimpname;
- if(name == nil)
- name = s->name;
+ name = s->extname;
adduint32(d, addstring(lookup(".dynstr", 0), name));
/* value */
@@ -472,7 +465,7 @@ adddynsym(Sym *s)
adduint8(d, 0);
/* shndx */
- if(!(s->cgoexport & CgoExportDynamic) && s->dynimpname != nil)
+ if(s->type == SDYNIMPORT)
adduint16(d, SHN_UNDEF);
else {
switch(s->type) {
diff --git a/src/cmd/5l/l.h b/src/cmd/5l/l.h
index 0b31b07ab..78f99d873 100644
--- a/src/cmd/5l/l.h
+++ b/src/cmd/5l/l.h
@@ -134,6 +134,7 @@ struct Prog
struct Sym
{
char* name;
+ char* extname; // name used in external object files
short type;
short version;
uchar dupok;
@@ -163,7 +164,6 @@ struct Sym
Sym* reachparent;
Sym* queue;
char* file;
- char* dynimpname;
char* dynimplib;
char* dynimpvers;
struct Section* sect;