From f1df07bf6a37bc291f293fd5cdfc9203dd22b31f Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 12 Jul 2011 17:49:55 -0700 Subject: [PATCH] 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 --- src/cmd/5l/asm.c | 12 ++++++++++++ src/cmd/6l/asm.c | 12 ++++++++++++ src/cmd/8l/asm.c | 12 ++++++++++++ 3 files changed, 36 insertions(+) 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]);