diff options
| author | Yuval Pavel Zholkover <paulzhol@gmail.com> | 2011-02-04 14:33:21 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2011-02-04 14:33:21 -0500 |
| commit | c14c4e55e00ff06b83063cc2117444a2d75a3b0d (patch) | |
| tree | 42c41f056bd764b82e585074d54bb8d78809a69e /src/cmd/ld/symtab.c | |
| parent | 6c5e4e18541d1e254de7bf26be849f09b2c1e8cc (diff) | |
| download | go-c14c4e55e00ff06b83063cc2117444a2d75a3b0d.tar.xz | |
8l: fix crash writing Plan 9 binaries
Was crashing with GOOS=plan9 unless -s was passed.
Add symbols and line numbers to Plan 9 a.out.
R=rsc
CC=golang-dev
https://golang.org/cl/4080050
Diffstat (limited to 'src/cmd/ld/symtab.c')
| -rw-r--r-- | src/cmd/ld/symtab.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/cmd/ld/symtab.c b/src/cmd/ld/symtab.c index 26e4def648..eba0589c2a 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; |
