Date: Wed, 20 Jul 2016 11:11:51 -0700 From: Conrad Meyer <cem@freebsd.org> To: Larry Rosenman <ler@lerctr.org> Cc: src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org, svn-src-head@freebsd.org, owner-svn-src-all@freebsd.org Subject: Re: svn commit: r303099 - head/sys/kern Message-ID: <CAG6CVpWNs23Wzgs21ZDDU5mxUsPfijgc2ajQ%2B39K20CRwD2rfA@mail.gmail.com> In-Reply-To: <7d98bc0deeedc54964b62911276c41cc@thebighonker.lerctr.org> References: <201607201659.u6KGxaNs010929@repo.freebsd.org> <7d98bc0deeedc54964b62911276c41cc@thebighonker.lerctr.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Mea culpa. Thanks for the report. Fixed in r303105. Best, Conrad On Wed, Jul 20, 2016 at 10:32 AM, Larry Rosenman <ler@lerctr.org> 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, ¬elst, ¬esz); >> 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-unsubscribe@freebsd.org" > > > -- > Larry Rosenman http://www.lerctr.org/~ler > Phone: +1 214-642-9640 E-Mail: ler@lerctr.org > US Mail: 17716 Limpia Crk, Round Rock, TX 78664-7281
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAG6CVpWNs23Wzgs21ZDDU5mxUsPfijgc2ajQ%2B39K20CRwD2rfA>