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/8l | |
| 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/8l')
| -rw-r--r-- | src/cmd/8l/asm.c | 58 |
1 files changed, 5 insertions, 53 deletions
diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index 1ac265aaa7..683eeba109 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -428,10 +428,9 @@ addgotsym(Sym *s) void adddynsym(Sym *s) { - Sym *d, *str; + Sym *d; int t; char *name; - vlong off; if(s->dynid >= 0) return; @@ -490,57 +489,10 @@ adddynsym(Sym *s) adduint16(d, t); } } else if(HEADTYPE == Hdarwin) { - // Mach-O symbol nlist32 - 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*12); - } - if(s->dynid <= -100) { // pre-allocated, see cmd/ld/go.c:^sortdynexp() - s->dynid = -s->dynid-100; - off = s->dynid*12; - } else { - off = d->size; - s->dynid = off/12; - } - // 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) - setuint32(d, off, 0); // value - else - setaddr(d, off, s); - off += 4; - } 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"); } } |
