Re: svn commit: r303099 - head/sys/kern

2018-03-15 Thread Eitan Adler
On 20 July 2016 at 09:59, Conrad E. Meyer  wrote:
> Author: cem
> Date: Wed Jul 20 16:59:36 2016
> New Revision: 303099
> URL: https://svnweb.freebsd.org/changeset/base/303099
>
> Log:
>   Extend ELF coredump to support more than 65535 segments

r303099, r303105, r303114, r308177

Is this and related safe to MFC? If so did I miss any ?



-- 
Eitan Adler
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"


Re: svn commit: r303099 - head/sys/kern

2016-07-20 Thread Conrad Meyer
Mea culpa.  Thanks for the report.  Fixed in r303105.

Best,
Conrad

On Wed, Jul 20, 2016 at 10:32 AM, Larry Rosenman  wrote:
> This broke my build:
> --- imgact_elf32.o ---
> In file included from /usr/src/sys/kern/imgact_elf32.c:31:
> /usr/src/sys/kern/imgact_elf.c:1663:8: error: format specifies type 'size_t'
> (aka 'unsigned long') but the argument has type 'Elf32_Off' (aka 'unsigned
> int') [-Werror,-Wformat]
>  ehdr->e_shoff, hdrsize - sizeof(Elf_Shdr)));
>  ^
> /usr/src/sys/sys/systm.h:86:17: note: expanded from macro 'KASSERT'
> kassert_panic msg;  \
>   ^~~
>
>
>
>
> On 2016-07-20 11:59, Conrad E. Meyer wrote:
>>
>> Author: cem
>> Date: Wed Jul 20 16:59:36 2016
>> New Revision: 303099
>> URL: https://svnweb.freebsd.org/changeset/base/303099
>>
>> Log:
>>   Extend ELF coredump to support more than 65535 segments
>>
>>   The ELF e_phnum field is only 16 bits wide. To support more than
>> 65535 segments
>>   (program headers), Sun's "Linker and Libraries Guide" table 7-7 (or
>> 12-7,
>>   depending on document version) prescribes a special first section header
>> where
>>   sh_info represents the real number of program headers.
>>
>>   Test code to follow, when it is ready.
>>
>>   Reference:http://docs.oracle.com/cd/E18752_01/pdf/817-1984.pdf
>>
>>   Reviewed by:  emaste, markj
>>   Sponsored by: EMC / Isilon Storage Division
>>   Differential Revision:https://reviews.freebsd.org/D7255
>>
>> Modified:
>>   head/sys/kern/imgact_elf.c
>>
>> Modified: head/sys/kern/imgact_elf.c
>>
>> ==
>> --- head/sys/kern/imgact_elf.c  Wed Jul 20 16:48:25 2016(r303098)
>> +++ head/sys/kern/imgact_elf.c  Wed Jul 20 16:59:36 2016(r303099)
>> @@ -1323,6 +1323,8 @@ __elfN(coredump)(struct thread *td, stru
>>  * Collect info about the core file header area.
>>  */
>> hdrsize = sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * (1 +
>> seginfo.count);
>> +   if (seginfo.count + 1 >= PN_XNUM)
>> +   hdrsize += sizeof(Elf_Shdr);
>> __elfN(prepare_notes)(td, , );
>> coresize = round_page(hdrsize + notesz) + seginfo.size;
>>
>> @@ -1618,10 +1620,10 @@ __elfN(puthdr)(struct thread *td, void *
>>  {
>> Elf_Ehdr *ehdr;
>> Elf_Phdr *phdr;
>> +   Elf_Shdr *shdr;
>> struct phdr_closure phc;
>>
>> ehdr = (Elf_Ehdr *)hdr;
>> -   phdr = (Elf_Phdr *)((char *)hdr + sizeof(Elf_Ehdr));
>>
>> ehdr->e_ident[EI_MAG0] = ELFMAG0;
>> ehdr->e_ident[EI_MAG1] = ELFMAG1;
>> @@ -1645,14 +1647,43 @@ __elfN(puthdr)(struct thread *td, void *
>> ehdr->e_flags = 0;
>> ehdr->e_ehsize = sizeof(Elf_Ehdr);
>> ehdr->e_phentsize = sizeof(Elf_Phdr);
>> -   ehdr->e_phnum = numsegs + 1;
>> ehdr->e_shentsize = sizeof(Elf_Shdr);
>> -   ehdr->e_shnum = 0;
>> ehdr->e_shstrndx = SHN_UNDEF;
>> +   if (numsegs + 1 < PN_XNUM) {
>> +   ehdr->e_phnum = numsegs + 1;
>> +   ehdr->e_shnum = 0;
>> +   } else {
>> +   ehdr->e_phnum = PN_XNUM;
>> +   ehdr->e_shnum = 1;
>> +
>> +   ehdr->e_shoff = ehdr->e_phoff +
>> +   (numsegs + 1) * ehdr->e_phentsize;
>> +   KASSERT(ehdr->e_shoff == hdrsize - sizeof(Elf_Shdr),
>> +   ("e_shoff: %zu, hdrsize - shdr: %zu",
>> +ehdr->e_shoff, hdrsize - sizeof(Elf_Shdr)));
>> +
>> +   shdr = (Elf_Shdr *)((char *)hdr + ehdr->e_shoff);
>> +   memset(shdr, 0, sizeof(*shdr));
>> +   /*
>> +* A special first section is used to hold large segment
>> and
>> +* section counts.  This was proposed by Sun Microsystems
>> in
>> +* Solaris and has been adopted by Linux; the standard ELF
>> +* tools are already familiar with the technique.
>> +*
>> +* See table 7-7 of the Solaris "Linker and Libraries
>> Guide"
>> +* (or 12-7 depending on the version of the document) for
>> more
>> +* details.
>> +*/
>> +   shdr->sh_type = SHT_NULL;
>> +   shdr->sh_size = ehdr->e_shnum;
>> +   shdr->sh_link = ehdr->e_shstrndx;
>> +   shdr->sh_info = numsegs + 1;
>> +   }
>>
>> /*
>>  * Fill in the program header entries.
>>  */
>> +   phdr = (Elf_Phdr *)((char *)hdr + ehdr->e_phoff);
>>
>> /* The note segement. */
>> phdr->p_type = PT_NOTE;
>> ___
>> svn-src-all@freebsd.org mailing list
>> https://lists.freebsd.org/mailman/listinfo/svn-src-all
>> To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"
>
>
> --
> Larry Rosenman  

Re: svn commit: r303099 - head/sys/kern

2016-07-20 Thread Larry Rosenman

This broke my build:
--- imgact_elf32.o ---
In file included from /usr/src/sys/kern/imgact_elf32.c:31:
/usr/src/sys/kern/imgact_elf.c:1663:8: error: format specifies type 
'size_t' (aka 'unsigned long') but the argument has type 'Elf32_Off' 
(aka 'unsigned int') [-Werror,-Wformat]

 ehdr->e_shoff, hdrsize - sizeof(Elf_Shdr)));
 ^
/usr/src/sys/sys/systm.h:86:17: note: expanded from macro 'KASSERT'
kassert_panic msg;  
\

  ^~~



On 2016-07-20 11:59, Conrad E. Meyer wrote:

Author: cem
Date: Wed Jul 20 16:59:36 2016
New Revision: 303099
URL: https://svnweb.freebsd.org/changeset/base/303099

Log:
  Extend ELF coredump to support more than 65535 segments

  The ELF e_phnum field is only 16 bits wide. To support more than
65535 segments
  (program headers), Sun's "Linker and Libraries Guide" table 7-7 (or 
12-7,
  depending on document version) prescribes a special first section 
header where

  sh_info represents the real number of program headers.

  Test code to follow, when it is ready.

  Reference:http://docs.oracle.com/cd/E18752_01/pdf/817-1984.pdf

  Reviewed by:  emaste, markj
  Sponsored by: EMC / Isilon Storage Division
  Differential Revision:https://reviews.freebsd.org/D7255

Modified:
  head/sys/kern/imgact_elf.c

Modified: head/sys/kern/imgact_elf.c
==
--- head/sys/kern/imgact_elf.c  Wed Jul 20 16:48:25 2016(r303098)
+++ head/sys/kern/imgact_elf.c  Wed Jul 20 16:59:36 2016(r303099)
@@ -1323,6 +1323,8 @@ __elfN(coredump)(struct thread *td, stru
 * Collect info about the core file header area.
 */
hdrsize = sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * (1 + seginfo.count);
+   if (seginfo.count + 1 >= PN_XNUM)
+   hdrsize += sizeof(Elf_Shdr);
__elfN(prepare_notes)(td, , );
coresize = round_page(hdrsize + notesz) + seginfo.size;

@@ -1618,10 +1620,10 @@ __elfN(puthdr)(struct thread *td, void *
 {
Elf_Ehdr *ehdr;
Elf_Phdr *phdr;
+   Elf_Shdr *shdr;
struct phdr_closure phc;

ehdr = (Elf_Ehdr *)hdr;
-   phdr = (Elf_Phdr *)((char *)hdr + sizeof(Elf_Ehdr));

ehdr->e_ident[EI_MAG0] = ELFMAG0;
ehdr->e_ident[EI_MAG1] = ELFMAG1;
@@ -1645,14 +1647,43 @@ __elfN(puthdr)(struct thread *td, void *
ehdr->e_flags = 0;
ehdr->e_ehsize = sizeof(Elf_Ehdr);
ehdr->e_phentsize = sizeof(Elf_Phdr);
-   ehdr->e_phnum = numsegs + 1;
ehdr->e_shentsize = sizeof(Elf_Shdr);
-   ehdr->e_shnum = 0;
ehdr->e_shstrndx = SHN_UNDEF;
+   if (numsegs + 1 < PN_XNUM) {
+   ehdr->e_phnum = numsegs + 1;
+   ehdr->e_shnum = 0;
+   } else {
+   ehdr->e_phnum = PN_XNUM;
+   ehdr->e_shnum = 1;
+
+   ehdr->e_shoff = ehdr->e_phoff +
+   (numsegs + 1) * ehdr->e_phentsize;
+   KASSERT(ehdr->e_shoff == hdrsize - sizeof(Elf_Shdr),
+   ("e_shoff: %zu, hdrsize - shdr: %zu",
+ehdr->e_shoff, hdrsize - sizeof(Elf_Shdr)));
+
+   shdr = (Elf_Shdr *)((char *)hdr + ehdr->e_shoff);
+   memset(shdr, 0, sizeof(*shdr));
+   /*
+* A special first section is used to hold large segment and
+* section counts.  This was proposed by Sun Microsystems in
+* Solaris and has been adopted by Linux; the standard ELF
+* tools are already familiar with the technique.
+*
+* See table 7-7 of the Solaris "Linker and Libraries Guide"
+* (or 12-7 depending on the version of the document) for more
+* details.
+*/
+   shdr->sh_type = SHT_NULL;
+   shdr->sh_size = ehdr->e_shnum;
+   shdr->sh_link = ehdr->e_shstrndx;
+   shdr->sh_info = numsegs + 1;
+   }

/*
 * Fill in the program header entries.
 */
+   phdr = (Elf_Phdr *)((char *)hdr + ehdr->e_phoff);

/* The note segement. */
phdr->p_type = PT_NOTE;
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"


--
Larry Rosenman http://www.lerctr.org/~ler
Phone: +1 214-642-9640 E-Mail: l...@lerctr.org
US Mail: 17716 Limpia Crk, Round Rock, TX 78664-7281
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"


svn commit: r303099 - head/sys/kern

2016-07-20 Thread Conrad E. Meyer
Author: cem
Date: Wed Jul 20 16:59:36 2016
New Revision: 303099
URL: https://svnweb.freebsd.org/changeset/base/303099

Log:
  Extend ELF coredump to support more than 65535 segments
  
  The ELF e_phnum field is only 16 bits wide. To support more than 65535 
segments
  (program headers), Sun's "Linker and Libraries Guide" table 7-7 (or 12-7,
  depending on document version) prescribes a special first section header where
  sh_info represents the real number of program headers.
  
  Test code to follow, when it is ready.
  
  Reference:http://docs.oracle.com/cd/E18752_01/pdf/817-1984.pdf
  
  Reviewed by:  emaste, markj
  Sponsored by: EMC / Isilon Storage Division
  Differential Revision:https://reviews.freebsd.org/D7255

Modified:
  head/sys/kern/imgact_elf.c

Modified: head/sys/kern/imgact_elf.c
==
--- head/sys/kern/imgact_elf.c  Wed Jul 20 16:48:25 2016(r303098)
+++ head/sys/kern/imgact_elf.c  Wed Jul 20 16:59:36 2016(r303099)
@@ -1323,6 +1323,8 @@ __elfN(coredump)(struct thread *td, stru
 * Collect info about the core file header area.
 */
hdrsize = sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * (1 + seginfo.count);
+   if (seginfo.count + 1 >= PN_XNUM)
+   hdrsize += sizeof(Elf_Shdr);
__elfN(prepare_notes)(td, , );
coresize = round_page(hdrsize + notesz) + seginfo.size;
 
@@ -1618,10 +1620,10 @@ __elfN(puthdr)(struct thread *td, void *
 {
Elf_Ehdr *ehdr;
Elf_Phdr *phdr;
+   Elf_Shdr *shdr;
struct phdr_closure phc;
 
ehdr = (Elf_Ehdr *)hdr;
-   phdr = (Elf_Phdr *)((char *)hdr + sizeof(Elf_Ehdr));
 
ehdr->e_ident[EI_MAG0] = ELFMAG0;
ehdr->e_ident[EI_MAG1] = ELFMAG1;
@@ -1645,14 +1647,43 @@ __elfN(puthdr)(struct thread *td, void *
ehdr->e_flags = 0;
ehdr->e_ehsize = sizeof(Elf_Ehdr);
ehdr->e_phentsize = sizeof(Elf_Phdr);
-   ehdr->e_phnum = numsegs + 1;
ehdr->e_shentsize = sizeof(Elf_Shdr);
-   ehdr->e_shnum = 0;
ehdr->e_shstrndx = SHN_UNDEF;
+   if (numsegs + 1 < PN_XNUM) {
+   ehdr->e_phnum = numsegs + 1;
+   ehdr->e_shnum = 0;
+   } else {
+   ehdr->e_phnum = PN_XNUM;
+   ehdr->e_shnum = 1;
+
+   ehdr->e_shoff = ehdr->e_phoff +
+   (numsegs + 1) * ehdr->e_phentsize;
+   KASSERT(ehdr->e_shoff == hdrsize - sizeof(Elf_Shdr),
+   ("e_shoff: %zu, hdrsize - shdr: %zu",
+ehdr->e_shoff, hdrsize - sizeof(Elf_Shdr)));
+
+   shdr = (Elf_Shdr *)((char *)hdr + ehdr->e_shoff);
+   memset(shdr, 0, sizeof(*shdr));
+   /*
+* A special first section is used to hold large segment and
+* section counts.  This was proposed by Sun Microsystems in
+* Solaris and has been adopted by Linux; the standard ELF
+* tools are already familiar with the technique.
+*
+* See table 7-7 of the Solaris "Linker and Libraries Guide"
+* (or 12-7 depending on the version of the document) for more
+* details.
+*/
+   shdr->sh_type = SHT_NULL;
+   shdr->sh_size = ehdr->e_shnum;
+   shdr->sh_link = ehdr->e_shstrndx;
+   shdr->sh_info = numsegs + 1;
+   }
 
/*
 * Fill in the program header entries.
 */
+   phdr = (Elf_Phdr *)((char *)hdr + ehdr->e_phoff);
 
/* The note segement. */
phdr->p_type = PT_NOTE;
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"