diff options
| author | Shenghou Ma <minux.ma@gmail.com> | 2014-02-23 16:20:40 -0500 |
|---|---|---|
| committer | Shenghou Ma <minux.ma@gmail.com> | 2014-02-23 16:20:40 -0500 |
| commit | d4a9bbef51d6b631fa799cc5560294f465273f47 (patch) | |
| tree | 1f3afd76b947ba4ded0ab0ae985a28e738b0bfd3 /src/cmd/ld/data.c | |
| parent | d4b6a198b3b44c8c9617c72ceca9c32ba089b5a8 (diff) | |
| download | go-d4a9bbef51d6b631fa799cc5560294f465273f47.tar.xz | |
cmd/ld: don't emit unreachable dynimport symbols in ELF symtab.
Fix build for Dragonfly BSD.
Fixes #7318.
Fixes #7367.
LGTM=jsing, iant
R=jsing, iant, mikioh.mikioh
CC=golang-codereviews
https://golang.org/cl/64340043
Diffstat (limited to 'src/cmd/ld/data.c')
| -rw-r--r-- | src/cmd/ld/data.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c index 8acb72331c..8c6cfed862 100644 --- a/src/cmd/ld/data.c +++ b/src/cmd/ld/data.c @@ -303,7 +303,7 @@ void dynrelocsym(LSym *s) { Reloc *r; - + if(HEADTYPE == Hwindows) { LSym *rel, *targ; @@ -312,6 +312,8 @@ dynrelocsym(LSym *s) return; for(r=s->r; r<s->r+s->nr; r++) { targ = r->sym; + if(!targ->reachable) + diag("internal inconsistency: dynamic symbol %s is not reachable.", targ->name); if(r->sym->plt == -2 && r->sym->got != -2) { // make dynimport JMP table for PE object files. targ->plt = rel->size; r->sym = rel; @@ -340,8 +342,11 @@ dynrelocsym(LSym *s) } for(r=s->r; r<s->r+s->nr; r++) { - if(r->sym != S && r->sym->type == SDYNIMPORT || r->type >= 256) + if(r->sym != S && r->sym->type == SDYNIMPORT || r->type >= 256) { + if(!r->sym->reachable) + diag("internal inconsistency: dynamic symbol %s is not reachable.", r->sym->name); adddynrel(s, r); + } } } |
