Re: svn commit: r303099 - head/sys/kern
On 20 July 2016 at 09:59, Conrad E. Meyerwrote: > 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
Mea culpa. Thanks for the report. Fixed in r303105. Best, Conrad On Wed, Jul 20, 2016 at 10:32 AM, Larry Rosenmanwrote: > 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
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
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"