diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-02-18 09:50:58 +0100 |
commit | c072558b90f1bbedc2022b0f30c8b1ac4712538e (patch) | |
tree | 67767591619e4bd8111fb05fac185cde94fb7378 /src/cmd/ld | |
parent | 5859517b767c99749a45651c15d4bae5520ebae8 (diff) | |
download | golang-upstream/2011.02.15.tar.gz |
Imported Upstream version 2011.02.15upstream/2011.02.15
Diffstat (limited to 'src/cmd/ld')
-rw-r--r-- | src/cmd/ld/go.c | 2 | ||||
-rw-r--r-- | src/cmd/ld/lib.c | 25 | ||||
-rw-r--r-- | src/cmd/ld/lib.h | 1 | ||||
-rw-r--r-- | src/cmd/ld/symtab.c | 102 |
4 files changed, 121 insertions, 9 deletions
diff --git a/src/cmd/ld/go.c b/src/cmd/ld/go.c index 8966b2a1f..2c6a6d084 100644 --- a/src/cmd/ld/go.c +++ b/src/cmd/ld/go.c @@ -148,8 +148,6 @@ ldpkg(Biobuf *f, char *pkg, int64 len, char *filename, int whence) } if(strcmp(pkg, "main") == 0 && strcmp(name, "main") != 0) fprint(2, "%s: %s: not package main (package %s)\n", argv0, filename, name); - else if(strcmp(pkg, "main") != 0 && strcmp(name, "main") == 0) - fprint(2, "%s: %s: importing %s, found package main", argv0, filename, pkg); loadpkgdata(filename, pkg, p0, p1 - p0); } diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index b1a62f25e..c144d4295 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -378,10 +378,9 @@ ldobj(Biobuf *f, char *pkg, int64 len, char *pn, int whence) int n, c1, c2, c3, c4; uint32 magic; vlong import0, import1, eof; - char src[1024]; + char *t; eof = Boffset(f) + len; - src[0] = '\0'; pn = strdup(pn); @@ -415,22 +414,34 @@ ldobj(Biobuf *f, char *pkg, int64 len, char *pn, int whence) line = Brdline(f, '\n'); if(line == nil) { if(Blinelen(f) > 0) { - diag("%s: malformed object file", pn); + diag("%s: not an object file", pn); return; } goto eof; } n = Blinelen(f) - 1; - if(n != strlen(thestring) || strncmp(line, thestring, n) != 0) { - if(line) - line[n] = '\0'; + line[n] = '\0'; + if(strncmp(line, "go object ", 10) != 0) { if(strlen(pn) > 3 && strcmp(pn+strlen(pn)-3, ".go") == 0) { print("%cl: input %s is not .%c file (use %cg to compile .go files)\n", thechar, pn, thechar, thechar); errorexit(); } - diag("file not %s [%s]\n", thestring, line); + if(strcmp(line, thestring) == 0) { + // old header format: just $GOOS + diag("%s: stale object file", pn); + return; + } + diag("%s: not an object file", pn); + return; + } + t = smprint("%s %s %s", getgoos(), thestring, getgoversion()); + if(strcmp(line+10, t) != 0) { + diag("%s: object is [%s] expected [%s]", pn, line+10, t); + free(t); return; } + free(t); + line[n] = '\n'; /* skip over exports and other info -- ends with \n!\n */ import0 = Boffset(f); diff --git a/src/cmd/ld/lib.h b/src/cmd/ld/lib.h index 4ac5d37f9..16dfb0dc3 100644 --- a/src/cmd/ld/lib.h +++ b/src/cmd/ld/lib.h @@ -156,6 +156,7 @@ vlong adduint8(Sym*, uint8); vlong adduint16(Sym*, uint16); void asmsym(void); void asmelfsym64(void); +void asmplan9sym(void); void strnput(char*, int); void dodata(void); void address(void); diff --git a/src/cmd/ld/symtab.c b/src/cmd/ld/symtab.c index 26e4def64..22777b6b5 100644 --- a/src/cmd/ld/symtab.c +++ b/src/cmd/ld/symtab.c @@ -136,6 +136,62 @@ asmelfsym32(void) genasmsym(putelfsym32); } +void +putplan9sym(Sym *x, char *s, int t, vlong addr, vlong size, int ver, Sym *go) +{ + int i; + + switch(t) { + case 'T': + case 't': + case 'L': + case 'l': + case 'D': + case 'd': + case 'B': + case 'b': + case 'a': + case 'p': + + case 'f': + case 'z': + case 'Z': + + case 'm': + lputb(addr); + cput(t+0x80); /* 0x80 is variable length */ + + if(t == 'z' || t == 'Z') { + cput(0); + for(i=1; s[i] != 0 || s[i+1] != 0; i += 2) { + cput(s[i]); + cput(s[i+1]); + } + cput(0); + cput(0); + i++; + } else { + /* skip the '<' in filenames */ + if(t=='f') + s++; + + for(i=0; s[i]; i++) + cput(s[i]); + cput(0); + } + + symsize += 4 + 1 + i + 1; + break; + default: + return; + }; +} + +void +asmplan9sym(void) +{ + genasmsym(putplan9sym); +} static Sym *symt; @@ -165,6 +221,52 @@ slputb(int32 v) } void +wputl(ushort w) +{ + cput(w); + cput(w>>8); +} + +void +wputb(ushort w) +{ + cput(w>>8); + cput(w); +} + +void +lputb(int32 l) +{ + cput(l>>24); + cput(l>>16); + cput(l>>8); + cput(l); +} + +void +lputl(int32 l) +{ + cput(l); + cput(l>>8); + cput(l>>16); + cput(l>>24); +} + +void +vputb(uint64 v) +{ + lputb(v>>32); + lputb(v); +} + +void +vputl(uint64 v) +{ + lputl(v); + lputl(v >> 32); +} + +void putsymb(Sym *s, char *name, int t, vlong v, vlong size, int ver, Sym *typ) { int i, f, l; |