diff options
Diffstat (limited to 'src/cmd/8l/obj.c')
-rw-r--r-- | src/cmd/8l/obj.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/src/cmd/8l/obj.c b/src/cmd/8l/obj.c index dcb8390b9..c819b9936 100644 --- a/src/cmd/8l/obj.c +++ b/src/cmd/8l/obj.c @@ -90,6 +90,7 @@ main(int argc, char *argv[]) INITRND = -1; INITENTRY = 0; LIBINITENTRY = 0; + linkmode = LinkAuto; nuxiinit(); flagcount("1", "use alternate profiling code", &debug['1']); @@ -112,9 +113,11 @@ main(int argc, char *argv[]) flagcount("a", "disassemble output", &debug['a']); flagcount("c", "dump call graph", &debug['c']); flagcount("d", "disable dynamic executable", &debug['d']); + flagstr("extld", "linker to run in external mode", &extld); + flagstr("extldflags", "flags for external linker", &extldflags); flagcount("f", "ignore version mismatch", &debug['f']); flagcount("g", "disable go package data checks", &debug['g']); - flagcount("hostobj", "generate host object file", &isobj); + flagfn1("linkmode", "mode: set link mode (internal, external, auto)", setlinkmode); flagstr("k", "sym: set field tracking symbol", &tracksym); flagstr("o", "outfile: set output file", &outfile); flagcount("p", "insert profiling code", &debug['p']); @@ -122,9 +125,11 @@ main(int argc, char *argv[]) flagcount("race", "enable race detector", &flag_race); flagcount("s", "disable symbol table", &debug['s']); flagcount("n", "dump symbol table", &debug['n']); + flagstr("tmpdir", "leave temporary files in this directory", &tmpdir); flagcount("u", "reject unsafe packages", &debug['u']); flagcount("v", "print link trace", &debug['v']); flagcount("w", "disable DWARF generation", &debug['w']); + // TODO: link mode flag flagparse(&argc, &argv, usage); @@ -136,13 +141,24 @@ main(int argc, char *argv[]) if(HEADTYPE == -1) HEADTYPE = headtype(goos); - if(isobj) { - switch(HEADTYPE) { - default: - sysfatal("cannot use -hostobj with -H %s", headstr(HEADTYPE)); - case Hlinux: - break; - } + // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when + // Go was built; see ../../make.bash. + if(linkmode == LinkAuto && strcmp(getgoextlinkenabled(), "0") == 0) + linkmode = LinkInternal; + + switch(HEADTYPE) { + default: + if(linkmode == LinkAuto) + linkmode = LinkInternal; + if(linkmode == LinkExternal && strcmp(getgoextlinkenabled(), "1") != 0) + sysfatal("cannot use -linkmode=external with -H %s", headstr(HEADTYPE)); + break; + case Hdarwin: + case Hfreebsd: + case Hlinux: + case Hnetbsd: + case Hopenbsd: + break; } if(outfile == nil) { @@ -308,6 +324,8 @@ main(int argc, char *argv[]) reloc(); asmb(); undef(); + hostlink(); + if(debug['v']) { Bprint(&bso, "%5.2f cpu time\n", cputime()); Bprint(&bso, "%d symbols\n", nsymbol); @@ -431,7 +449,7 @@ ldobj1(Biobuf *f, char *pkg, int64 len, char *pn) ntext = 0; eof = Boffset(f) + len; src[0] = 0; - + pn = estrdup(pn); // we keep it in Sym* references newloop: memset(h, 0, sizeof(h)); @@ -596,11 +614,15 @@ loop: goto loop; case ALOCALS: + if(skip) + goto casdef; cursym->locals = p->to.offset; pc++; goto loop; case ATYPE: + if(skip) + goto casdef; pc++; goto loop; |