aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/6l
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-03-10 16:24:01 -0400
committerRuss Cox <rsc@golang.org>2013-03-10 16:24:01 -0400
commitdf6072b41c76f2ac839d248b7c706fa554f483ed (patch)
tree82b0780587d8d44f02bf9920cf79b0519cc147a6 /src/cmd/6l
parent85d83c2e51ae67a8f041e3949ffcaef17c7d9d59 (diff)
downloadgo-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.c58
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");
}
}