diff options
| author | Shenghou Ma <minux.ma@gmail.com> | 2014-02-11 18:43:05 -0500 |
|---|---|---|
| committer | Shenghou Ma <minux.ma@gmail.com> | 2014-02-11 18:43:05 -0500 |
| commit | 4687b5414789581f635ff96d401e23a50da8024b (patch) | |
| tree | 1030ba8ac290d33edb64477874f084d1c3e5e1e2 /src/cmd/ld | |
| parent | 13a5958db328a74f863d8391f453a81ae326fd31 (diff) | |
| download | go-4687b5414789581f635ff96d401e23a50da8024b.tar.xz | |
cmd/ld, cmd/6l: part 2 of solaris/amd64 linker changes.
Second part of the solaris/amd64 linker changes: relocation and symbol table.
LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/61330043
Diffstat (limited to 'src/cmd/ld')
| -rw-r--r-- | src/cmd/ld/data.c | 8 | ||||
| -rw-r--r-- | src/cmd/ld/symtab.c | 9 |
2 files changed, 11 insertions, 6 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c index 640fd6d6ef..8acb72331c 100644 --- a/src/cmd/ld/data.c +++ b/src/cmd/ld/data.c @@ -154,9 +154,9 @@ relocsym(LSym *s) if(r->type >= 256) continue; - if(r->sym != S && r->sym->type == SDYNIMPORT) + // Solaris needs the ability to reference dynimport symbols. + if(HEADTYPE != Hsolaris && r->sym != S && r->sym->type == SDYNIMPORT) diag("unhandled relocation for %s (type %d rtype %d)", r->sym->name, r->sym->type, r->type); - if(r->sym != S && r->sym->type != STLSBSS && !r->sym->reachable) diag("unreachable sym in relocation: %s %s", s->name, r->sym->name); @@ -194,7 +194,7 @@ relocsym(LSym *s) r->xadd += symaddr(rs) - symaddr(rs->outer); rs = rs->outer; } - if(rs->type != SHOSTOBJ && rs->sect == nil) + if(rs->type != SHOSTOBJ && rs->type != SDYNIMPORT && rs->sect == nil) diag("missing section for %s", rs->name); r->xsym = rs; @@ -225,7 +225,7 @@ relocsym(LSym *s) rs = rs->outer; } r->xadd -= r->siz; // relative to address after the relocated chunk - if(rs->type != SHOSTOBJ && rs->sect == nil) + if(rs->type != SHOSTOBJ && rs->type != SDYNIMPORT && rs->sect == nil) diag("missing section for %s", rs->name); r->xsym = rs; diff --git a/src/cmd/ld/symtab.c b/src/cmd/ld/symtab.c index 54e6041483..0789c8a3eb 100644 --- a/src/cmd/ld/symtab.c +++ b/src/cmd/ld/symtab.c @@ -171,6 +171,7 @@ void asmelfsym(void) { LSym *s; + char *name; // the first symbol entry is reserved putelfsyment(0, 0, 0, (STB_LOCAL<<4)|STT_NOTYPE, 0, 0); @@ -196,9 +197,13 @@ asmelfsym(void) genasmsym(putelfsym); for(s=ctxt->allsym; s!=S; s=s->allsym) { - if(s->type != SHOSTOBJ) + if(s->type != SHOSTOBJ && s->type != SDYNIMPORT) continue; - putelfsyment(putelfstr(s->name), 0, 0, (STB_GLOBAL<<4)|STT_NOTYPE, 0, 0); + if(s->type == SDYNIMPORT) + name = s->extname; + else + name = s->name; + putelfsyment(putelfstr(name), 0, 0, (STB_GLOBAL<<4)|STT_NOTYPE, 0, 0); s->elfsym = numelfsym++; } } |
