summaryrefslogtreecommitdiff
path: root/src/cmd/6l
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-11-18 13:51:05 -0800
committerRuss Cox <rsc@golang.org>2009-11-18 13:51:05 -0800
commit564466bac1b8cc6307cc7d6ace36b362cde38658 (patch)
tree8727eaf3e5e42d7a9e34c07b88e86694c8706d2e /src/cmd/6l
parent89ff095d3af3036482652e9ea591d63412d8937f (diff)
downloadgo-564466bac1b8cc6307cc7d6ace36b362cde38658.tar.gz
ld: move interpreter string into first block of ELF file
necessary on freebsd. R=r, dho CC=golang-dev http://codereview.appspot.com/157069
Diffstat (limited to 'src/cmd/6l')
-rw-r--r--src/cmd/6l/asm.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c
index 3679e5cf4..4f7f6e22f 100644
--- a/src/cmd/6l/asm.c
+++ b/src/cmd/6l/asm.c
@@ -315,19 +315,6 @@ doelf(void)
elfstr[ElfStrDynstr] = addstring(shstrtab, ".dynstr");
elfstr[ElfStrRela] = addstring(shstrtab, ".rela");
- /* interpreter string */
- s = lookup(".interp", 0);
- s->reachable = 1;
- s->type = SDATA; // TODO: rodata
- switch(HEADTYPE) {
- case 7:
- addstring(lookup(".interp", 0), linuxdynld);
- break;
- case 9:
- addstring(lookup(".interp", 0), freebsddynld);
- break;
- }
-
/*
* hash table.
* only entries that other objects need to find when
@@ -688,7 +675,14 @@ asmb(void)
sh->type = SHT_PROGBITS;
sh->flags = SHF_ALLOC;
sh->addralign = 1;
- shsym(sh, lookup(".interp", 0));
+ switch(HEADTYPE) {
+ case 7:
+ elfinterp(sh, startva, linuxdynld);
+ break;
+ case 9:
+ elfinterp(sh, startva, freebsddynld);
+ break;
+ }
ph = newElfPhdr();
ph->type = PT_INTERP;
@@ -903,7 +897,8 @@ asmb(void)
a += elfwritehdr();
a += elfwritephdrs();
a += elfwriteshdrs();
- if (a > ELFRESERVE)
+ cflush();
+ if(a+elfwriteinterp() > ELFRESERVE)
diag("ELFRESERVE too small: %d > %d", a, ELFRESERVE);
break;
}