From: David Anderson Date: Wed, 13 Jul 2011 00:49:55 +0000 (-0700) Subject: 5l, 6l, 8l: Add a PT_LOAD PHDR entry for the PHDR. X-Git-Tag: weekly.2011-07-19~97 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f1df07bf6a37bc291f293fd5cdfc9203dd22b31f;p=gostls13.git 5l, 6l, 8l: Add a PT_LOAD PHDR entry for the PHDR. Per the TIS ELF spec, if a PHDR entry is present in the program header table, it must be part of the memory image of the program. Failure to do this makes elflint complain, and causes some tools that manipulate ELF to crash. R=iant, rsc CC=dave, golang-dev https://golang.org/cl/4650067 --- 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]);