diff --git a/src/cmd/5l/asm.c b/src/cmd/5l/asm.c index 2c9e50d00e..28de6255a6 100644 --- a/src/cmd/5l/asm.c +++ b/src/cmd/5l/asm.c @@ -294,6 +294,7 @@ asmb(void) ElfPhdr *ph, *pph; ElfShdr *sh; Section *sect; + int o; if(debug['v']) Bprint(&bso, "%5.2f asmb\n", cputime()); @@ -462,6 +463,17 @@ asmb(void) pph->paddr = INITTEXT - HEADR + pph->off; pph->align = INITRND; + /* + * PHDR must be in a loaded segment. Adjust the text + * segment boundaries downwards to include it. + */ + o = segtext.vaddr - pph->vaddr; + segtext.vaddr -= o; + segtext.len += o; + o = segtext.fileoff - pph->off; + segtext.fileoff -= o; + segtext.filelen += o; + if(!debug['d']) { /* interpreter for dynamic linking */ sh = newElfShdr(elfstr[ElfStrInterp]); diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index 9136e03794..581ec5a20b 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -699,6 +699,7 @@ asmb(void) ElfPhdr *ph, *pph; ElfShdr *sh; Section *sect; + int o; if(debug['v']) Bprint(&bso, "%5.2f asmb\n", cputime()); @@ -862,6 +863,17 @@ asmb(void) pph->paddr = INITTEXT - HEADR + pph->off; pph->align = INITRND; + /* + * PHDR must be in a loaded segment. Adjust the text + * segment boundaries downwards to include it. + */ + o = segtext.vaddr - pph->vaddr; + segtext.vaddr -= o; + segtext.len += o; + o = segtext.fileoff - pph->off; + segtext.fileoff -= o; + segtext.filelen += o; + if(!debug['d']) { /* interpreter */ sh = newElfShdr(elfstr[ElfStrInterp]); diff --git a/src/cmd/8l/asm.c b/src/cmd/8l/asm.c index e1ccfb8a3d..82bff3e1ed 100644 --- a/src/cmd/8l/asm.c +++ b/src/cmd/8l/asm.c @@ -665,6 +665,7 @@ asmb(void) ElfShdr *sh; Section *sect; Sym *sym; + int o; int i; if(debug['v']) @@ -932,6 +933,17 @@ asmb(void) pph->paddr = INITTEXT - HEADR + pph->off; pph->align = INITRND; + /* + * PHDR must be in a loaded segment. Adjust the text + * segment boundaries downwards to include it. + */ + o = segtext.vaddr - pph->vaddr; + segtext.vaddr -= o; + segtext.len += o; + o = segtext.fileoff - pph->off; + segtext.fileoff -= o; + segtext.filelen += o; + if(!debug['d']) { /* interpreter */ sh = newElfShdr(elfstr[ElfStrInterp]);