diff options
author | Russ Cox <rsc@golang.org> | 2009-01-20 15:36:43 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-01-20 15:36:43 -0800 |
commit | be323cab54e32b56ff7c58ce0828a486bb328d3f (patch) | |
tree | d32b7a674c46e005de789ff680eec98f5e729fca /src/cmd/6l/obj.c | |
parent | 8498cd2641a58da02b38cab7a7ea9efb1064f243 (diff) | |
download | golang-be323cab54e32b56ff7c58ce0828a486bb328d3f.tar.gz |
6l: do not link in objects from an archive just for init functions.
(makes go libraries behave more like c libraries.)
R=r
DELTA=85 (67 added, 12 deleted, 6 changed)
OCL=23133
CL=23139
Diffstat (limited to 'src/cmd/6l/obj.c')
-rw-r--r-- | src/cmd/6l/obj.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/src/cmd/6l/obj.c b/src/cmd/6l/obj.c index a250f1c45..d6af049d9 100644 --- a/src/cmd/6l/obj.c +++ b/src/cmd/6l/obj.c @@ -368,6 +368,8 @@ main(int argc, char *argv[]) sprint(a, "%s/lib/lib_%s_%s.a", goroot, goarch, goos); objfile(a); } + ignoreoptfuncs(); + // TODO(rsc): remove unused code and data definetypestrings(); definetypesigs(); @@ -945,8 +947,11 @@ loop: if(debug['W']) print(" ANAME %s\n", s->name); h[o] = s; - if((v == D_EXTERN || v == D_STATIC) && s->type == 0) + if((v == D_EXTERN || v == D_STATIC) && s->type == 0) { s->type = SXREF; + if(isinitfunc(s)) + s->type = SOPT; // optional function; don't pull in an object file just for s. + } if(v == D_FILE) { if(s->type != SFILE) { histgen++; @@ -1083,7 +1088,7 @@ loop: case ATEXT: s = p->from.sym; - if(ntext++ == 0 && s->type != 0 && s->type != SXREF) { + if(ntext++ == 0 && s->type != 0 && s->type != SXREF && s->type != SOPT) { /* redefinition, so file has probably been seen before */ if(debug['v']) Bprint(&bso, "skipping: %s: redefinition: %s", pn, s->name); @@ -1100,26 +1105,14 @@ loop: diag("%s: no TEXT symbol: %P", pn, p); errorexit(); } - if(s->type != 0 && s->type != SXREF) { + if(s->type != 0 && s->type != SXREF && s->type != SOPT) { if(p->from.scale & DUPOK) { skip = 1; goto casdef; } diag("%s: redefinition: %s\n%P", pn, s->name, p); } - s->type = STEXT; - s->value = pc; - lastp->link = p; - lastp = p; - p->pc = pc; - pc++; - if(textp == P) { - textp = p; - etextp = p; - goto loop; - } - etextp->pcond = p; - etextp = p; + newtext(p, s); goto loop; case AMODE: |