aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld/data.c
diff options
context:
space:
mode:
authorShenghou Ma <minux.ma@gmail.com>2014-02-23 16:20:40 -0500
committerShenghou Ma <minux.ma@gmail.com>2014-02-23 16:20:40 -0500
commitd4a9bbef51d6b631fa799cc5560294f465273f47 (patch)
tree1f3afd76b947ba4ded0ab0ae985a28e738b0bfd3 /src/cmd/ld/data.c
parentd4b6a198b3b44c8c9617c72ceca9c32ba089b5a8 (diff)
downloadgo-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.c9
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);
+ }
}
}