diff options
| author | Russ Cox <rsc@golang.org> | 2013-03-10 16:24:01 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2013-03-10 16:24:01 -0400 |
| commit | df6072b41c76f2ac839d248b7c706fa554f483ed (patch) | |
| tree | 82b0780587d8d44f02bf9920cf79b0519cc147a6 /src/cmd/6l | |
| parent | 85d83c2e51ae67a8f041e3949ffcaef17c7d9d59 (diff) | |
| download | go-df6072b41c76f2ac839d248b7c706fa554f483ed.tar.xz | |
cmd/ld: include full symbol table in Mach-O output
This makes binaries work with OS X nm.
R=ken2
CC=golang-dev
https://golang.org/cl/7558044
Diffstat (limited to 'src/cmd/6l')
| -rw-r--r-- | src/cmd/6l/asm.c | 58 |
1 files changed, 5 insertions, 53 deletions
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index 95a161b88a..40bea63bfe 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -448,10 +448,9 @@ addgotsym(Sym *s) void adddynsym(Sym *s) { - Sym *d, *str; + Sym *d; int t; char *name; - vlong off; if(s->dynid >= 0) return; @@ -515,57 +514,10 @@ adddynsym(Sym *s) addstring(lookup(".dynstr", 0), s->dynimplib)); } } else if(HEADTYPE == Hdarwin) { - // Mach-o symbol nlist64 - d = lookup(".dynsym", 0); - name = s->dynimpname; - if(name == nil) - name = s->name; - if(d->size == 0 && ndynexp > 0) { // pre-allocate for dynexps - symgrow(d, ndynexp*16); - } - if(s->dynid <= -100) { // pre-allocated, see cmd/ld/go.c:^sortdynexp() - s->dynid = -s->dynid-100; - off = s->dynid*16; - } else { - off = d->size; - s->dynid = off/16; - } - // darwin still puts _ prefixes on all C symbols - str = lookup(".dynstr", 0); - setuint32(d, off, str->size); - off += 4; - adduint8(str, '_'); - addstring(str, name); - if(s->type == SDYNIMPORT) { - setuint8(d, off, 0x01); // type - N_EXT - external symbol - off++; - setuint8(d, off, 0); // section - off++; - } else { - setuint8(d, off, 0x0f); - off++; - switch(s->type) { - default: - case STEXT: - setuint8(d, off, 1); - break; - case SDATA: - setuint8(d, off, 2); - break; - case SBSS: - setuint8(d, off, 4); - break; - } - off++; - } - setuint16(d, off, 0); // desc - off += 2; - if(s->type == SDYNIMPORT) - setuint64(d, off, 0); // value - else - setaddr(d, off, s); - off += 8; - } else if(HEADTYPE != Hwindows) { + diag("adddynsym: missed symbol %s (%s)", s->name, s->dynimpname); + } else if(HEADTYPE == Hwindows) { + // already taken care of + } else { diag("adddynsym: unsupported binary format"); } } |
