aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld/data.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2013-03-10 14:17:04 -0400
committerRuss Cox <rsc@golang.org>2013-03-10 14:17:04 -0400
commitb83d4af330858e819787efbbf6c5267f44d5b654 (patch)
treecd975d3a9d63fafb51816f49dfc3265ce37f29ab /src/cmd/ld/data.c
parente982ecacd1920d4314c84ecfca316a9bf0698fd3 (diff)
downloadgo-b83d4af330858e819787efbbf6c5267f44d5b654.tar.xz
cmd/ld: make mach-o sections match internal sections
This brings Mach-O generation more in line with ELF generation. Having separate sections for the symtab and pclntab mean that we can find them that way, instead of using the deprecated debug segments. (And the host linker will keep separate sections for us, but probably not the debug segments.) R=ken2 CC=golang-dev https://golang.org/cl/7688043
Diffstat (limited to 'src/cmd/ld/data.c')
-rw-r--r--src/cmd/ld/data.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/cmd/ld/data.c b/src/cmd/ld/data.c
index 22cb4f3e60..10dba90305 100644
--- a/src/cmd/ld/data.c
+++ b/src/cmd/ld/data.c
@@ -879,6 +879,9 @@ symalign(Sym *s)
{
int32 align;
+ if(s->align != 0)
+ return s->align;
+
align = MaxAlign;
while(align > s->size && align > 1)
align >>= 1;
@@ -1136,9 +1139,10 @@ dodata(void)
lookup("end", 0)->sect = sect;
/* we finished segdata, begin segtext */
+ s = datap;
+ datsize = 0;
/* read-only data */
- s = datap;
sect = addsection(&segtext, ".rodata", 04);
sect->align = maxalign(s, STYPELINK-1);
sect->vaddr = 0;
@@ -1202,7 +1206,7 @@ dodata(void)
}
sect->len = datsize - sect->vaddr;
- /* read-only ELF sections */
+ /* read-only ELF, Mach-O sections */
for(; s != nil && s->type < SELFSECT; s = s->next) {
sect = addsection(&segtext, s->name, 04);
sect->align = symalign(s);
@@ -1266,6 +1270,7 @@ address(void)
Section *typelink;
Sym *sym, *sub;
uvlong va;
+ vlong vlen;
va = INITTEXT;
segtext.rwx = 05;
@@ -1295,11 +1300,11 @@ address(void)
noptrbss = nil;
datarelro = nil;
for(s=segdata.sect; s != nil; s=s->next) {
+ vlen = s->len;
if(s->next)
- s->len = s->next->vaddr - s->vaddr;
+ vlen = s->next->vaddr - s->vaddr;
s->vaddr = va;
- va += s->len;
- segdata.filelen += s->len;
+ va += vlen;
segdata.len = va - segdata.vaddr;
if(strcmp(s->name, ".data") == 0)
data = s;