Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-11 Thread Vivek Goyal
On Mon, Mar 11, 2013 at 09:31:41AM +0900, HATAYAMA Daisuke wrote:
> From: Zhang Yanfei 
> Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
> Date: Sun, 10 Mar 2013 14:46:31 +0800
> 
> > 于 2013年03月05日 15:35, Zhang Yanfei 写道:
> >> 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:
> 
> > 
> > One minor suggestion.
> > 
> > Previously, when the code assumes program headers are following immediately
> > the ELF header, it uses
> > 
> >  elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
> > 
> > to calculate the size of ELF header and ELF program headers
> > 
> > This patch avoids the assumption, and uses ehdr.e_phoff to get the program
> > headers' address. But it will read unrelated contents into elfcorebuf if
> > program headers are not following immediately the ELF header. So could the
> > code be:
> > 
> > elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
> > addr = elfcorehdr_addr + ehdr.e_phoff;
> > memcpy(elfcorebuf, , sizeof(Elf64_Ehdr));
> > read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz -
> >  sizeof(Elf64_Ehdr), , 0);
> > (Elf64_Ehdr *)elfcorebuf->e_phoff = sizeof(Elf64_Ehdr);
> 
> Thanks. This is not minor suggestion. This is critical. My code is
> completely broken. On ELF, segments and headers other than ELF header
> can occur in any positions. This means program header table can occur
> after segments. So, on terabyte systems, e_phoff can be more than
> terabytes.

Agreed. It is safer to not copy al the bits till e_phoff.

Thanks
Vivek
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-11 Thread Vivek Goyal
On Mon, Mar 11, 2013 at 09:31:41AM +0900, HATAYAMA Daisuke wrote:
 From: Zhang Yanfei zhangyan...@cn.fujitsu.com
 Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
 Date: Sun, 10 Mar 2013 14:46:31 +0800
 
  于 2013年03月05日 15:35, Zhang Yanfei 写道:
  于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:
 cut
  
  One minor suggestion.
  
  Previously, when the code assumes program headers are following immediately
  the ELF header, it uses
  
   elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
  
  to calculate the size of ELF header and ELF program headers
  
  This patch avoids the assumption, and uses ehdr.e_phoff to get the program
  headers' address. But it will read unrelated contents into elfcorebuf if
  program headers are not following immediately the ELF header. So could the
  code be:
  
  elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
  addr = elfcorehdr_addr + ehdr.e_phoff;
  memcpy(elfcorebuf, ehdr, sizeof(Elf64_Ehdr));
  read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz -
   sizeof(Elf64_Ehdr), addr, 0);
  (Elf64_Ehdr *)elfcorebuf-e_phoff = sizeof(Elf64_Ehdr);
 
 Thanks. This is not minor suggestion. This is critical. My code is
 completely broken. On ELF, segments and headers other than ELF header
 can occur in any positions. This means program header table can occur
 after segments. So, on terabyte systems, e_phoff can be more than
 terabytes.

Agreed. It is safer to not copy al the bits till e_phoff.

Thanks
Vivek
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-10 Thread HATAYAMA Daisuke
From: Zhang Yanfei 
Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
Date: Sun, 10 Mar 2013 14:46:31 +0800

> 于 2013年03月05日 15:35, Zhang Yanfei 写道:
>> 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:

> 
> One minor suggestion.
> 
> Previously, when the code assumes program headers are following immediately
> the ELF header, it uses
> 
>  elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
> 
> to calculate the size of ELF header and ELF program headers
> 
> This patch avoids the assumption, and uses ehdr.e_phoff to get the program
> headers' address. But it will read unrelated contents into elfcorebuf if
> program headers are not following immediately the ELF header. So could the
> code be:
> 
> elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
> addr = elfcorehdr_addr + ehdr.e_phoff;
> memcpy(elfcorebuf, , sizeof(Elf64_Ehdr));
> read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz -
>  sizeof(Elf64_Ehdr), , 0);
> (Elf64_Ehdr *)elfcorebuf->e_phoff = sizeof(Elf64_Ehdr);

Thanks. This is not minor suggestion. This is critical. My code is
completely broken. On ELF, segments and headers other than ELF header
can occur in any positions. This means program header table can occur
after segments. So, on terabyte systems, e_phoff can be more than
terabytes.

Sorry, this was due to my carelessness.

Thanks.
HATAYAMA, Daisuke

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-10 Thread HATAYAMA Daisuke
From: Zhang Yanfei zhangyan...@cn.fujitsu.com
Subject: Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly
Date: Sun, 10 Mar 2013 14:46:31 +0800

 于 2013年03月05日 15:35, Zhang Yanfei 写道:
 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:
cut
 
 One minor suggestion.
 
 Previously, when the code assumes program headers are following immediately
 the ELF header, it uses
 
  elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
 
 to calculate the size of ELF header and ELF program headers
 
 This patch avoids the assumption, and uses ehdr.e_phoff to get the program
 headers' address. But it will read unrelated contents into elfcorebuf if
 program headers are not following immediately the ELF header. So could the
 code be:
 
 elfcorebuf_sz = sizeof(Elf64_Ehdr) + ehdr.e_phnum * sizeof(Elf64_Phdr);
 addr = elfcorehdr_addr + ehdr.e_phoff;
 memcpy(elfcorebuf, ehdr, sizeof(Elf64_Ehdr));
 read_from_oldmem(elfcorebuf + sizeof(Elf64_Ehdr), elfcorebuf_sz -
  sizeof(Elf64_Ehdr), addr, 0);
 (Elf64_Ehdr *)elfcorebuf-e_phoff = sizeof(Elf64_Ehdr);

Thanks. This is not minor suggestion. This is critical. My code is
completely broken. On ELF, segments and headers other than ELF header
can occur in any positions. This means program header table can occur
after segments. So, on terabyte systems, e_phoff can be more than
terabytes.

Sorry, this was due to my carelessness.

Thanks.
HATAYAMA, Daisuke

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-09 Thread Zhang Yanfei
于 2013年03月05日 15:35, Zhang Yanfei 写道:
> 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:
>> Code around /proc/vmcore currently assumes program header table is
>> next to ELF header. But future change can break the assumption on
>> kexec-tools and the 1st kernel. To avoid worst case, now refer to
>> e_phoff member that indicates position of program header table in
>> file-offset.
> 
> Reviewed-by: Zhang Yanfei 
> 
>>
>> Signed-off-by: HATAYAMA Daisuke 
>> ---
>>
>>  fs/proc/vmcore.c |   40 
>>  1 files changed, 20 insertions(+), 20 deletions(-)
>>
>> diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
>> index b870f74..abf4f01 100644
>> --- a/fs/proc/vmcore.c
>> +++ b/fs/proc/vmcore.c
>> @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr)
>>  Elf64_Phdr *phdr_ptr;
>>  
>>  ehdr_ptr = (Elf64_Ehdr *)elfptr;
>> -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
>> -size = sizeof(Elf64_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr));
>> +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff);
>> +size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr));
>>  for (i = 0; i < ehdr_ptr->e_phnum; i++) {
>>  size += phdr_ptr->p_memsz;
>>  phdr_ptr++;
>> @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr)
>>  Elf32_Phdr *phdr_ptr;
>>  
>>  ehdr_ptr = (Elf32_Ehdr *)elfptr;
>> -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
>> -size = sizeof(Elf32_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr));
>> +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff);
>> +size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr));
>>  for (i = 0; i < ehdr_ptr->e_phnum; i++) {
>>  size += phdr_ptr->p_memsz;
>>  phdr_ptr++;
>> @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
>> size_t *elfsz,
>>  u64 phdr_sz = 0, note_off;
>>  
>>  ehdr_ptr = (Elf64_Ehdr *)elfptr;
>> -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
>> +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff);
>>  for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
>>  int j;
>>  void *notes_section;
>> @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
>> size_t *elfsz,
>>  /* Prepare merged PT_NOTE program header. */
>>  phdr.p_type= PT_NOTE;
>>  phdr.p_flags   = 0;
>> -note_off = sizeof(Elf64_Ehdr) +
>> +note_off = ehdr_ptr->e_phoff +
>>  (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr);
>>  phdr.p_offset  = note_off;
>>  phdr.p_vaddr   = phdr.p_paddr = 0;
>> @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char 
>> *elfptr, size_t *elfsz,
>>  phdr.p_align   = 0;
>>  
>>  /* Add merged PT_NOTE program header*/
>> -tmp = elfptr + sizeof(Elf64_Ehdr);
>> +tmp = elfptr + ehdr_ptr->e_phoff;
>>  memcpy(tmp, , sizeof(phdr));
>>  tmp += sizeof(phdr);
>>  
>>  /* Remove unwanted PT_NOTE program headers. */
>>  i = (nr_ptnote - 1) * sizeof(Elf64_Phdr);
>>  *elfsz = *elfsz - i;
>> -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr)));
>> +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf64_Phdr)));
>>  
>>  /* Modify e_phnum to reflect merged headers. */
>>  ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1;
>> @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
>> size_t *elfsz,
>>  u64 phdr_sz = 0, note_off;
>>  
>>  ehdr_ptr = (Elf32_Ehdr *)elfptr;
>> -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
>> +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff);
>>  for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
>>  int j;
>>  void *notes_section;
>> @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
>> size_t *elfsz,
>>  /* Prepare merged PT_NOTE program header. */
>>  phdr.p_type= PT_NOTE;
>>  phdr.p_flags   = 0;
>> -note_off = sizeof(Elf32_Ehdr) +
>> +note_off = ehdr_ptr->e_phoff +
>>  (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr);
>>  phdr.p_offset  = note_off;
>>  phdr.p_vaddr   = phdr.p_paddr = 0;
>> @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char 
>> *elfptr, size_t *elfsz,
>>  phdr.p_align   = 0;
>>  
>>  /* Add merged PT_NOTE program header*/
>> -tmp = elfptr + sizeof(Elf32_Ehdr);
>> +tmp = elfptr + ehdr_ptr->e_phoff;
>>  memcpy(tmp, , sizeof(phdr));
>>  tmp += sizeof(phdr);
>>  
>>  /* Remove unwanted PT_NOTE program headers. */
>>  i = (nr_ptnote - 1) * sizeof(Elf32_Phdr);
>>  *elfsz = *elfsz - i;
>> -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr)));
>> +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf32_Phdr)));
>>  
>>  /* 

Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-09 Thread Zhang Yanfei
于 2013年03月05日 15:35, Zhang Yanfei 写道:
 于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:
 Code around /proc/vmcore currently assumes program header table is
 next to ELF header. But future change can break the assumption on
 kexec-tools and the 1st kernel. To avoid worst case, now refer to
 e_phoff member that indicates position of program header table in
 file-offset.
 
 Reviewed-by: Zhang Yanfei zhangyan...@cn.fujitsu.com
 

 Signed-off-by: HATAYAMA Daisuke d.hatay...@jp.fujitsu.com
 ---

  fs/proc/vmcore.c |   40 
  1 files changed, 20 insertions(+), 20 deletions(-)

 diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
 index b870f74..abf4f01 100644
 --- a/fs/proc/vmcore.c
 +++ b/fs/proc/vmcore.c
 @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr)
  Elf64_Phdr *phdr_ptr;
  
  ehdr_ptr = (Elf64_Ehdr *)elfptr;
 -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
 -size = sizeof(Elf64_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr));
 +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff);
 +size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr));
  for (i = 0; i  ehdr_ptr-e_phnum; i++) {
  size += phdr_ptr-p_memsz;
  phdr_ptr++;
 @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr)
  Elf32_Phdr *phdr_ptr;
  
  ehdr_ptr = (Elf32_Ehdr *)elfptr;
 -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
 -size = sizeof(Elf32_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr));
 +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff);
 +size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr));
  for (i = 0; i  ehdr_ptr-e_phnum; i++) {
  size += phdr_ptr-p_memsz;
  phdr_ptr++;
 @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
 size_t *elfsz,
  u64 phdr_sz = 0, note_off;
  
  ehdr_ptr = (Elf64_Ehdr *)elfptr;
 -phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
 +phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff);
  for (i = 0; i  ehdr_ptr-e_phnum; i++, phdr_ptr++) {
  int j;
  void *notes_section;
 @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
 size_t *elfsz,
  /* Prepare merged PT_NOTE program header. */
  phdr.p_type= PT_NOTE;
  phdr.p_flags   = 0;
 -note_off = sizeof(Elf64_Ehdr) +
 +note_off = ehdr_ptr-e_phoff +
  (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr);
  phdr.p_offset  = note_off;
  phdr.p_vaddr   = phdr.p_paddr = 0;
 @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char 
 *elfptr, size_t *elfsz,
  phdr.p_align   = 0;
  
  /* Add merged PT_NOTE program header*/
 -tmp = elfptr + sizeof(Elf64_Ehdr);
 +tmp = elfptr + ehdr_ptr-e_phoff;
  memcpy(tmp, phdr, sizeof(phdr));
  tmp += sizeof(phdr);
  
  /* Remove unwanted PT_NOTE program headers. */
  i = (nr_ptnote - 1) * sizeof(Elf64_Phdr);
  *elfsz = *elfsz - i;
 -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr)));
 +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf64_Phdr)));
  
  /* Modify e_phnum to reflect merged headers. */
  ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1;
 @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
 size_t *elfsz,
  u64 phdr_sz = 0, note_off;
  
  ehdr_ptr = (Elf32_Ehdr *)elfptr;
 -phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
 +phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff);
  for (i = 0; i  ehdr_ptr-e_phnum; i++, phdr_ptr++) {
  int j;
  void *notes_section;
 @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
 size_t *elfsz,
  /* Prepare merged PT_NOTE program header. */
  phdr.p_type= PT_NOTE;
  phdr.p_flags   = 0;
 -note_off = sizeof(Elf32_Ehdr) +
 +note_off = ehdr_ptr-e_phoff +
  (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr);
  phdr.p_offset  = note_off;
  phdr.p_vaddr   = phdr.p_paddr = 0;
 @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char 
 *elfptr, size_t *elfsz,
  phdr.p_align   = 0;
  
  /* Add merged PT_NOTE program header*/
 -tmp = elfptr + sizeof(Elf32_Ehdr);
 +tmp = elfptr + ehdr_ptr-e_phoff;
  memcpy(tmp, phdr, sizeof(phdr));
  tmp += sizeof(phdr);
  
  /* Remove unwanted PT_NOTE program headers. */
  i = (nr_ptnote - 1) * sizeof(Elf32_Phdr);
  *elfsz = *elfsz - i;
 -memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr)));
 +memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf32_Phdr)));
  
  /* Modify e_phnum to reflect merged headers. */
  ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1;
 @@ -422,10 +422,10 @@ static int __init 
 process_ptload_program_headers_elf64(char *elfptr,
  

Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-04 Thread Zhang Yanfei
于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:
> Code around /proc/vmcore currently assumes program header table is
> next to ELF header. But future change can break the assumption on
> kexec-tools and the 1st kernel. To avoid worst case, now refer to
> e_phoff member that indicates position of program header table in
> file-offset.

Reviewed-by: Zhang Yanfei 

> 
> Signed-off-by: HATAYAMA Daisuke 
> ---
> 
>  fs/proc/vmcore.c |   40 
>  1 files changed, 20 insertions(+), 20 deletions(-)
> 
> diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
> index b870f74..abf4f01 100644
> --- a/fs/proc/vmcore.c
> +++ b/fs/proc/vmcore.c
> @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr)
>   Elf64_Phdr *phdr_ptr;
>  
>   ehdr_ptr = (Elf64_Ehdr *)elfptr;
> - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
> - size = sizeof(Elf64_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr));
> + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff);
> + size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr));
>   for (i = 0; i < ehdr_ptr->e_phnum; i++) {
>   size += phdr_ptr->p_memsz;
>   phdr_ptr++;
> @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr)
>   Elf32_Phdr *phdr_ptr;
>  
>   ehdr_ptr = (Elf32_Ehdr *)elfptr;
> - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
> - size = sizeof(Elf32_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr));
> + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff);
> + size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr));
>   for (i = 0; i < ehdr_ptr->e_phnum; i++) {
>   size += phdr_ptr->p_memsz;
>   phdr_ptr++;
> @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
> size_t *elfsz,
>   u64 phdr_sz = 0, note_off;
>  
>   ehdr_ptr = (Elf64_Ehdr *)elfptr;
> - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
> + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff);
>   for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
>   int j;
>   void *notes_section;
> @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
> size_t *elfsz,
>   /* Prepare merged PT_NOTE program header. */
>   phdr.p_type= PT_NOTE;
>   phdr.p_flags   = 0;
> - note_off = sizeof(Elf64_Ehdr) +
> + note_off = ehdr_ptr->e_phoff +
>   (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr);
>   phdr.p_offset  = note_off;
>   phdr.p_vaddr   = phdr.p_paddr = 0;
> @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char 
> *elfptr, size_t *elfsz,
>   phdr.p_align   = 0;
>  
>   /* Add merged PT_NOTE program header*/
> - tmp = elfptr + sizeof(Elf64_Ehdr);
> + tmp = elfptr + ehdr_ptr->e_phoff;
>   memcpy(tmp, , sizeof(phdr));
>   tmp += sizeof(phdr);
>  
>   /* Remove unwanted PT_NOTE program headers. */
>   i = (nr_ptnote - 1) * sizeof(Elf64_Phdr);
>   *elfsz = *elfsz - i;
> - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr)));
> + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf64_Phdr)));
>  
>   /* Modify e_phnum to reflect merged headers. */
>   ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1;
> @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
> size_t *elfsz,
>   u64 phdr_sz = 0, note_off;
>  
>   ehdr_ptr = (Elf32_Ehdr *)elfptr;
> - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
> + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff);
>   for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
>   int j;
>   void *notes_section;
> @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
> size_t *elfsz,
>   /* Prepare merged PT_NOTE program header. */
>   phdr.p_type= PT_NOTE;
>   phdr.p_flags   = 0;
> - note_off = sizeof(Elf32_Ehdr) +
> + note_off = ehdr_ptr->e_phoff +
>   (ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr);
>   phdr.p_offset  = note_off;
>   phdr.p_vaddr   = phdr.p_paddr = 0;
> @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char 
> *elfptr, size_t *elfsz,
>   phdr.p_align   = 0;
>  
>   /* Add merged PT_NOTE program header*/
> - tmp = elfptr + sizeof(Elf32_Ehdr);
> + tmp = elfptr + ehdr_ptr->e_phoff;
>   memcpy(tmp, , sizeof(phdr));
>   tmp += sizeof(phdr);
>  
>   /* Remove unwanted PT_NOTE program headers. */
>   i = (nr_ptnote - 1) * sizeof(Elf32_Phdr);
>   *elfsz = *elfsz - i;
> - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr)));
> + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf32_Phdr)));
>  
>   /* Modify e_phnum to reflect merged headers. */
>   ehdr_ptr->e_phnum = 

[PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-04 Thread HATAYAMA Daisuke
Code around /proc/vmcore currently assumes program header table is
next to ELF header. But future change can break the assumption on
kexec-tools and the 1st kernel. To avoid worst case, now refer to
e_phoff member that indicates position of program header table in
file-offset.

Signed-off-by: HATAYAMA Daisuke 
---

 fs/proc/vmcore.c |   40 
 1 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
index b870f74..abf4f01 100644
--- a/fs/proc/vmcore.c
+++ b/fs/proc/vmcore.c
@@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr)
Elf64_Phdr *phdr_ptr;
 
ehdr_ptr = (Elf64_Ehdr *)elfptr;
-   phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
-   size = sizeof(Elf64_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr));
+   phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff);
+   size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf64_Phdr));
for (i = 0; i < ehdr_ptr->e_phnum; i++) {
size += phdr_ptr->p_memsz;
phdr_ptr++;
@@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr)
Elf32_Phdr *phdr_ptr;
 
ehdr_ptr = (Elf32_Ehdr *)elfptr;
-   phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
-   size = sizeof(Elf32_Ehdr) + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr));
+   phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff);
+   size = ehdr_ptr->e_phoff + ((ehdr_ptr->e_phnum) * sizeof(Elf32_Phdr));
for (i = 0; i < ehdr_ptr->e_phnum; i++) {
size += phdr_ptr->p_memsz;
phdr_ptr++;
@@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
size_t *elfsz,
u64 phdr_sz = 0, note_off;
 
ehdr_ptr = (Elf64_Ehdr *)elfptr;
-   phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
+   phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr->e_phoff);
for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
int j;
void *notes_section;
@@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
size_t *elfsz,
/* Prepare merged PT_NOTE program header. */
phdr.p_type= PT_NOTE;
phdr.p_flags   = 0;
-   note_off = sizeof(Elf64_Ehdr) +
+   note_off = ehdr_ptr->e_phoff +
(ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr);
phdr.p_offset  = note_off;
phdr.p_vaddr   = phdr.p_paddr = 0;
@@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char *elfptr, 
size_t *elfsz,
phdr.p_align   = 0;
 
/* Add merged PT_NOTE program header*/
-   tmp = elfptr + sizeof(Elf64_Ehdr);
+   tmp = elfptr + ehdr_ptr->e_phoff;
memcpy(tmp, , sizeof(phdr));
tmp += sizeof(phdr);
 
/* Remove unwanted PT_NOTE program headers. */
i = (nr_ptnote - 1) * sizeof(Elf64_Phdr);
*elfsz = *elfsz - i;
-   memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr)));
+   memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf64_Phdr)));
 
/* Modify e_phnum to reflect merged headers. */
ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1;
@@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
size_t *elfsz,
u64 phdr_sz = 0, note_off;
 
ehdr_ptr = (Elf32_Ehdr *)elfptr;
-   phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
+   phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr->e_phoff);
for (i = 0; i < ehdr_ptr->e_phnum; i++, phdr_ptr++) {
int j;
void *notes_section;
@@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
size_t *elfsz,
/* Prepare merged PT_NOTE program header. */
phdr.p_type= PT_NOTE;
phdr.p_flags   = 0;
-   note_off = sizeof(Elf32_Ehdr) +
+   note_off = ehdr_ptr->e_phoff +
(ehdr_ptr->e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr);
phdr.p_offset  = note_off;
phdr.p_vaddr   = phdr.p_paddr = 0;
@@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char *elfptr, 
size_t *elfsz,
phdr.p_align   = 0;
 
/* Add merged PT_NOTE program header*/
-   tmp = elfptr + sizeof(Elf32_Ehdr);
+   tmp = elfptr + ehdr_ptr->e_phoff;
memcpy(tmp, , sizeof(phdr));
tmp += sizeof(phdr);
 
/* Remove unwanted PT_NOTE program headers. */
i = (nr_ptnote - 1) * sizeof(Elf32_Phdr);
*elfsz = *elfsz - i;
-   memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr)));
+   memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr->e_phoff-sizeof(Elf32_Phdr)));
 
/* Modify e_phnum to reflect merged headers. */
ehdr_ptr->e_phnum = ehdr_ptr->e_phnum - nr_ptnote + 1;
@@ -422,10 +422,10 @@ static int __init 
process_ptload_program_headers_elf64(char *elfptr,
struct vmcore *new;
 

[PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-04 Thread HATAYAMA Daisuke
Code around /proc/vmcore currently assumes program header table is
next to ELF header. But future change can break the assumption on
kexec-tools and the 1st kernel. To avoid worst case, now refer to
e_phoff member that indicates position of program header table in
file-offset.

Signed-off-by: HATAYAMA Daisuke d.hatay...@jp.fujitsu.com
---

 fs/proc/vmcore.c |   40 
 1 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
index b870f74..abf4f01 100644
--- a/fs/proc/vmcore.c
+++ b/fs/proc/vmcore.c
@@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr)
Elf64_Phdr *phdr_ptr;
 
ehdr_ptr = (Elf64_Ehdr *)elfptr;
-   phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
-   size = sizeof(Elf64_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr));
+   phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff);
+   size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr));
for (i = 0; i  ehdr_ptr-e_phnum; i++) {
size += phdr_ptr-p_memsz;
phdr_ptr++;
@@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr)
Elf32_Phdr *phdr_ptr;
 
ehdr_ptr = (Elf32_Ehdr *)elfptr;
-   phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
-   size = sizeof(Elf32_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr));
+   phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff);
+   size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr));
for (i = 0; i  ehdr_ptr-e_phnum; i++) {
size += phdr_ptr-p_memsz;
phdr_ptr++;
@@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
size_t *elfsz,
u64 phdr_sz = 0, note_off;
 
ehdr_ptr = (Elf64_Ehdr *)elfptr;
-   phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
+   phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff);
for (i = 0; i  ehdr_ptr-e_phnum; i++, phdr_ptr++) {
int j;
void *notes_section;
@@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
size_t *elfsz,
/* Prepare merged PT_NOTE program header. */
phdr.p_type= PT_NOTE;
phdr.p_flags   = 0;
-   note_off = sizeof(Elf64_Ehdr) +
+   note_off = ehdr_ptr-e_phoff +
(ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr);
phdr.p_offset  = note_off;
phdr.p_vaddr   = phdr.p_paddr = 0;
@@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char *elfptr, 
size_t *elfsz,
phdr.p_align   = 0;
 
/* Add merged PT_NOTE program header*/
-   tmp = elfptr + sizeof(Elf64_Ehdr);
+   tmp = elfptr + ehdr_ptr-e_phoff;
memcpy(tmp, phdr, sizeof(phdr));
tmp += sizeof(phdr);
 
/* Remove unwanted PT_NOTE program headers. */
i = (nr_ptnote - 1) * sizeof(Elf64_Phdr);
*elfsz = *elfsz - i;
-   memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr)));
+   memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf64_Phdr)));
 
/* Modify e_phnum to reflect merged headers. */
ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1;
@@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
size_t *elfsz,
u64 phdr_sz = 0, note_off;
 
ehdr_ptr = (Elf32_Ehdr *)elfptr;
-   phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
+   phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff);
for (i = 0; i  ehdr_ptr-e_phnum; i++, phdr_ptr++) {
int j;
void *notes_section;
@@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
size_t *elfsz,
/* Prepare merged PT_NOTE program header. */
phdr.p_type= PT_NOTE;
phdr.p_flags   = 0;
-   note_off = sizeof(Elf32_Ehdr) +
+   note_off = ehdr_ptr-e_phoff +
(ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr);
phdr.p_offset  = note_off;
phdr.p_vaddr   = phdr.p_paddr = 0;
@@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char *elfptr, 
size_t *elfsz,
phdr.p_align   = 0;
 
/* Add merged PT_NOTE program header*/
-   tmp = elfptr + sizeof(Elf32_Ehdr);
+   tmp = elfptr + ehdr_ptr-e_phoff;
memcpy(tmp, phdr, sizeof(phdr));
tmp += sizeof(phdr);
 
/* Remove unwanted PT_NOTE program headers. */
i = (nr_ptnote - 1) * sizeof(Elf32_Phdr);
*elfsz = *elfsz - i;
-   memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr)));
+   memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf32_Phdr)));
 
/* Modify e_phnum to reflect merged headers. */
ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1;
@@ -422,10 +422,10 @@ static int __init 
process_ptload_program_headers_elf64(char *elfptr,
struct vmcore *new;
 

Re: [PATCH v2 01/20] vmcore: refer to e_phoff member explicitly

2013-03-04 Thread Zhang Yanfei
于 2013年03月02日 16:35, HATAYAMA Daisuke 写道:
 Code around /proc/vmcore currently assumes program header table is
 next to ELF header. But future change can break the assumption on
 kexec-tools and the 1st kernel. To avoid worst case, now refer to
 e_phoff member that indicates position of program header table in
 file-offset.

Reviewed-by: Zhang Yanfei zhangyan...@cn.fujitsu.com

 
 Signed-off-by: HATAYAMA Daisuke d.hatay...@jp.fujitsu.com
 ---
 
  fs/proc/vmcore.c |   40 
  1 files changed, 20 insertions(+), 20 deletions(-)
 
 diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
 index b870f74..abf4f01 100644
 --- a/fs/proc/vmcore.c
 +++ b/fs/proc/vmcore.c
 @@ -221,8 +221,8 @@ static u64 __init get_vmcore_size_elf64(char *elfptr)
   Elf64_Phdr *phdr_ptr;
  
   ehdr_ptr = (Elf64_Ehdr *)elfptr;
 - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
 - size = sizeof(Elf64_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr));
 + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff);
 + size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf64_Phdr));
   for (i = 0; i  ehdr_ptr-e_phnum; i++) {
   size += phdr_ptr-p_memsz;
   phdr_ptr++;
 @@ -238,8 +238,8 @@ static u64 __init get_vmcore_size_elf32(char *elfptr)
   Elf32_Phdr *phdr_ptr;
  
   ehdr_ptr = (Elf32_Ehdr *)elfptr;
 - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
 - size = sizeof(Elf32_Ehdr) + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr));
 + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff);
 + size = ehdr_ptr-e_phoff + ((ehdr_ptr-e_phnum) * sizeof(Elf32_Phdr));
   for (i = 0; i  ehdr_ptr-e_phnum; i++) {
   size += phdr_ptr-p_memsz;
   phdr_ptr++;
 @@ -259,7 +259,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
 size_t *elfsz,
   u64 phdr_sz = 0, note_off;
  
   ehdr_ptr = (Elf64_Ehdr *)elfptr;
 - phdr_ptr = (Elf64_Phdr*)(elfptr + sizeof(Elf64_Ehdr));
 + phdr_ptr = (Elf64_Phdr*)(elfptr + ehdr_ptr-e_phoff);
   for (i = 0; i  ehdr_ptr-e_phnum; i++, phdr_ptr++) {
   int j;
   void *notes_section;
 @@ -305,7 +305,7 @@ static int __init merge_note_headers_elf64(char *elfptr, 
 size_t *elfsz,
   /* Prepare merged PT_NOTE program header. */
   phdr.p_type= PT_NOTE;
   phdr.p_flags   = 0;
 - note_off = sizeof(Elf64_Ehdr) +
 + note_off = ehdr_ptr-e_phoff +
   (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf64_Phdr);
   phdr.p_offset  = note_off;
   phdr.p_vaddr   = phdr.p_paddr = 0;
 @@ -313,14 +313,14 @@ static int __init merge_note_headers_elf64(char 
 *elfptr, size_t *elfsz,
   phdr.p_align   = 0;
  
   /* Add merged PT_NOTE program header*/
 - tmp = elfptr + sizeof(Elf64_Ehdr);
 + tmp = elfptr + ehdr_ptr-e_phoff;
   memcpy(tmp, phdr, sizeof(phdr));
   tmp += sizeof(phdr);
  
   /* Remove unwanted PT_NOTE program headers. */
   i = (nr_ptnote - 1) * sizeof(Elf64_Phdr);
   *elfsz = *elfsz - i;
 - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf64_Ehdr)-sizeof(Elf64_Phdr)));
 + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf64_Phdr)));
  
   /* Modify e_phnum to reflect merged headers. */
   ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1;
 @@ -340,7 +340,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
 size_t *elfsz,
   u64 phdr_sz = 0, note_off;
  
   ehdr_ptr = (Elf32_Ehdr *)elfptr;
 - phdr_ptr = (Elf32_Phdr*)(elfptr + sizeof(Elf32_Ehdr));
 + phdr_ptr = (Elf32_Phdr*)(elfptr + ehdr_ptr-e_phoff);
   for (i = 0; i  ehdr_ptr-e_phnum; i++, phdr_ptr++) {
   int j;
   void *notes_section;
 @@ -386,7 +386,7 @@ static int __init merge_note_headers_elf32(char *elfptr, 
 size_t *elfsz,
   /* Prepare merged PT_NOTE program header. */
   phdr.p_type= PT_NOTE;
   phdr.p_flags   = 0;
 - note_off = sizeof(Elf32_Ehdr) +
 + note_off = ehdr_ptr-e_phoff +
   (ehdr_ptr-e_phnum - nr_ptnote +1) * sizeof(Elf32_Phdr);
   phdr.p_offset  = note_off;
   phdr.p_vaddr   = phdr.p_paddr = 0;
 @@ -394,14 +394,14 @@ static int __init merge_note_headers_elf32(char 
 *elfptr, size_t *elfsz,
   phdr.p_align   = 0;
  
   /* Add merged PT_NOTE program header*/
 - tmp = elfptr + sizeof(Elf32_Ehdr);
 + tmp = elfptr + ehdr_ptr-e_phoff;
   memcpy(tmp, phdr, sizeof(phdr));
   tmp += sizeof(phdr);
  
   /* Remove unwanted PT_NOTE program headers. */
   i = (nr_ptnote - 1) * sizeof(Elf32_Phdr);
   *elfsz = *elfsz - i;
 - memmove(tmp, tmp+i, ((*elfsz)-sizeof(Elf32_Ehdr)-sizeof(Elf32_Phdr)));
 + memmove(tmp, tmp+i, ((*elfsz)-ehdr_ptr-e_phoff-sizeof(Elf32_Phdr)));
  
   /* Modify e_phnum to reflect merged headers. */
   ehdr_ptr-e_phnum = ehdr_ptr-e_phnum - nr_ptnote + 1;
 @@ -422,10 +422,10 @@ static int __init