diff options
Diffstat (limited to 'src/cmd/5l/obj.c')
-rw-r--r-- | src/cmd/5l/obj.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c index 6aa7fdd69..24e6294a8 100644 --- a/src/cmd/5l/obj.c +++ b/src/cmd/5l/obj.c @@ -82,6 +82,7 @@ main(int argc, char *argv[]) INITRND = -1; INITENTRY = 0; LIBINITENTRY = 0; + linkmode = LinkInternal; // TODO: LinkAuto once everything works. nuxiinit(); p = getgoarm(); @@ -113,25 +114,42 @@ 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']); flagstr("k", "sym: set field tracking symbol", &tracksym); + flagfn1("linkmode", "mode: set link mode (internal, external, auto)", setlinkmode); flagcount("n", "dump symbol table", &debug['n']); flagstr("o", "outfile: set output file", &outfile); flagcount("p", "insert profiling code", &debug['p']); flagstr("r", "dir1:dir2:...: set ELF dynamic linker search path", &rpath); flagcount("race", "enable race detector", &flag_race); flagcount("s", "disable symbol table", &debug['s']); + 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']); flagcount("shared", "generate shared object", &flag_shared); + // TODO: link mode flag flagparse(&argc, &argv, usage); if(argc != 1) usage(); + // getgoextlinkenabled is based on GO_EXTLINK_ENABLED when + // Go was built; see ../../make.bash. + if(linkmode == LinkAuto && strcmp(getgoextlinkenabled(), "0") == 0) + linkmode = LinkInternal; + + if(linkmode == LinkExternal) { + diag("only -linkmode=internal is supported"); + errorexit(); + } else if(linkmode == LinkAuto) { + linkmode = LinkInternal; + } + libinit(); if(HEADTYPE == -1) @@ -268,6 +286,7 @@ main(int argc, char *argv[]) reloc(); asmb(); undef(); + hostlink(); if(debug['c']) print("ARM size = %d\n", armsize); @@ -424,6 +443,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)); @@ -595,11 +615,15 @@ loop: break; case ALOCALS: + if(skip) + goto casedef; cursym->locals = p->to.offset; pc++; break; case ATYPE: + if(skip) + goto casedef; pc++; goto loop; |