diff options
Diffstat (limited to 'src/cmd/5l/obj.c')
-rw-r--r-- | src/cmd/5l/obj.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/src/cmd/5l/obj.c b/src/cmd/5l/obj.c index 24e6294a8..80f5787dc 100644 --- a/src/cmd/5l/obj.c +++ b/src/cmd/5l/obj.c @@ -81,8 +81,7 @@ main(int argc, char *argv[]) INITDAT = -1; INITRND = -1; INITENTRY = 0; - LIBINITENTRY = 0; - linkmode = LinkInternal; // TODO: LinkAuto once everything works. + linkmode = LinkAuto; nuxiinit(); p = getgoarm(); @@ -118,6 +117,7 @@ main(int argc, char *argv[]) flagstr("extldflags", "flags for external linker", &extldflags); flagcount("f", "ignore version mismatch", &debug['f']); flagcount("g", "disable go package data checks", &debug['g']); + flagstr("installsuffix", "pkg directory suffix", &flag_installsuffix); 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']); @@ -126,34 +126,43 @@ main(int argc, char *argv[]) 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']); + flagcount("shared", "generate shared object (implies -linkmode external)", &flag_shared); 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(); + if(flag_shared) + linkmode = LinkExternal; + + mywhatsys(); + + if(HEADTYPE == -1) + HEADTYPE = headtype(goos); + // 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; + 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 Hlinux: + break; } libinit(); - if(HEADTYPE == -1) - HEADTYPE = headtype(goos); switch(HEADTYPE) { default: diag("unknown -H option"); @@ -208,7 +217,7 @@ main(int argc, char *argv[]) case Hnetbsd: debug['d'] = 0; // with dynamic linking tlsoffset = -8; // hardcoded number, first 4-byte word for g, and then 4-byte word for m - // this number is known to ../../pkg/runtime/cgo/gcc_linux_arm.c + // this number is known to ../../pkg/runtime/rt0_*_arm.s elfinit(); HEADR = ELFRESERVE; if(INITTEXT == -1) @@ -253,6 +262,7 @@ main(int argc, char *argv[]) // mark some functions that are only referenced after linker code editing if(debug['F']) mark(rlookup("_sfloat", 0)); + mark(lookup("runtime.read_tls_fallback", 0)); deadcode(); if(textp == nil) { diag("no code"); @@ -325,7 +335,7 @@ zaddr(char *pn, Biobuf *f, Adr *a, Sym *h[]) c = BGETC(f); if(c < 0 || c > NSYM){ print("sym out of range: %d\n", c); - Bputc(f, ALAST+1); + BPUTC(f, ALAST+1); return; } a->sym = h[c]; @@ -334,7 +344,7 @@ zaddr(char *pn, Biobuf *f, Adr *a, Sym *h[]) if((schar)a->reg < 0 || a->reg > NREG) { print("register out of range %d\n", a->reg); - Bputc(f, ALAST+1); + BPUTC(f, ALAST+1); return; /* force real diagnostic */ } @@ -352,7 +362,7 @@ zaddr(char *pn, Biobuf *f, Adr *a, Sym *h[]) switch(a->type) { default: print("unknown type %d\n", a->type); - Bputc(f, ALAST+1); + BPUTC(f, ALAST+1); return; /* force real diagnostic */ case D_NONE: @@ -368,13 +378,13 @@ zaddr(char *pn, Biobuf *f, Adr *a, Sym *h[]) break; case D_CONST2: - a->offset2 = Bget4(f); // fall through + a->offset2 = BGETLE4(f); // fall through case D_BRANCH: case D_OREG: case D_CONST: case D_OCONST: case D_SHIFT: - a->offset = Bget4(f); + a->offset = BGETLE4(f); break; case D_SCONST: @@ -383,8 +393,8 @@ zaddr(char *pn, Biobuf *f, Adr *a, Sym *h[]) break; case D_FCONST: - a->ieee.l = Bget4(f); - a->ieee.h = Bget4(f); + a->ieee.l = BGETLE4(f); + a->ieee.h = BGETLE4(f); break; } s = a->sym; @@ -467,7 +477,7 @@ loop: if(o == ANAME || o == ASIGNAME) { sig = 0; if(o == ASIGNAME) - sig = Bget4(f); + sig = BGETLE4(f); v = BGETC(f); /* type */ o = BGETC(f); /* sym */ r = 0; @@ -522,7 +532,7 @@ loop: p->as = o; p->scond = BGETC(f); p->reg = BGETC(f); - p->line = Bget4(f); + p->line = BGETLE4(f); zaddr(pn, f, &p->from, h); fromgotype = adrgotype; @@ -549,6 +559,7 @@ loop: addhist(p->line, D_FILE); /* 'z' */ if(p->to.offset) addhist(p->to.offset, D_FILE1); /* 'Z' */ + savehist(p->line, p->to.offset); histfrogp = 0; goto loop; @@ -614,13 +625,6 @@ loop: pc++; break; - case ALOCALS: - if(skip) - goto casedef; - cursym->locals = p->to.offset; - pc++; - break; - case ATYPE: if(skip) goto casedef; @@ -667,6 +671,7 @@ loop: p->to.offset = autosize; autosize += 4; s->type = STEXT; + s->hist = gethist(); s->text = p; s->value = pc; s->args = p->to.offset2; |