Commit d2b2b3f4 authored by Russ Cox's avatar Russ Cox

6l, 8l: fix Mach-O binaries with many dynamic libraries

R=ken2
CC=golang-dev
https://golang.org/cl/4529084
parent 0b209b36
...@@ -177,7 +177,7 @@ main(int argc, char *argv[]) ...@@ -177,7 +177,7 @@ main(int argc, char *argv[])
*/ */
tlsoffset = 0x8a0; tlsoffset = 0x8a0;
machoinit(); machoinit();
HEADR = MACHORESERVE; HEADR = INITIAL_MACHO_HEADR;
if(INITRND == -1) if(INITRND == -1)
INITRND = 4096; INITRND = 4096;
if(INITTEXT == -1) if(INITTEXT == -1)
......
...@@ -218,7 +218,7 @@ main(int argc, char *argv[]) ...@@ -218,7 +218,7 @@ main(int argc, char *argv[])
*/ */
tlsoffset = 0x468; tlsoffset = 0x468;
machoinit(); machoinit();
HEADR = MACHORESERVE; HEADR = INITIAL_MACHO_HEADR;
if(INITTEXT == -1) if(INITTEXT == -1)
INITTEXT = 4096+HEADR; INITTEXT = 4096+HEADR;
if(INITDAT == -1) if(INITDAT == -1)
......
...@@ -17,6 +17,14 @@ static MachoSeg seg[16]; ...@@ -17,6 +17,14 @@ static MachoSeg seg[16];
static MachoDebug xdebug[16]; static MachoDebug xdebug[16];
static int nload, mload, nseg, ndebug, nsect; static int nload, mload, nseg, ndebug, nsect;
// Amount of space left for adding load commands
// that refer to dynamic libraries. Because these have
// to go in the Mach-O header, we can't just pick a
// "big enough" header size. The initial header is
// one page, the non-dynamic library stuff takes
// up about 1300 bytes; we overestimate that as 2k.
static int load_budget = INITIAL_MACHO_HEADR - 2*1024;
void void
machoinit(void) machoinit(void)
{ {
...@@ -267,6 +275,17 @@ domacho(void) ...@@ -267,6 +275,17 @@ domacho(void)
void void
machoadddynlib(char *lib) machoadddynlib(char *lib)
{ {
// Will need to store the library name rounded up
// and 24 bytes of header metadata. If not enough
// space, grab another page of initial space at the
// beginning of the output file.
load_budget -= (strlen(lib)+7)/8*8 + 24;
if(load_budget < 0) {
HEADR += 4096;
INITTEXT += 4096;
load_budget += 4096;
}
if(ndylib%32 == 0) { if(ndylib%32 == 0) {
dylib = realloc(dylib, (ndylib+32)*sizeof dylib[0]); dylib = realloc(dylib, (ndylib+32)*sizeof dylib[0]);
if(dylib == nil) { if(dylib == nil) {
...@@ -463,8 +482,8 @@ asmbmacho(void) ...@@ -463,8 +482,8 @@ asmbmacho(void)
} }
a = machowrite(); a = machowrite();
if(a > MACHORESERVE) if(a > HEADR)
diag("MACHORESERVE too small: %d > %d", a, MACHORESERVE); diag("HEADR too small: %d > %d", a, HEADR);
} }
vlong vlong
......
...@@ -63,7 +63,7 @@ void machoinit(void); ...@@ -63,7 +63,7 @@ void machoinit(void);
* for Header, PHeaders, and SHeaders. * for Header, PHeaders, and SHeaders.
* May waste some. * May waste some.
*/ */
#define MACHORESERVE 3*1024 #define INITIAL_MACHO_HEADR 4*1024
enum { enum {
MACHO_CPU_AMD64 = (1<<24)|7, MACHO_CPU_AMD64 = (1<<24)|7,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment