Date: Wed, 20 Jul 2016 12:32:41 -0500 From: Larry Rosenman <ler@lerctr.org> To: "Conrad E. Meyer" <cem@freebsd.org> Cc: 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: <7d98bc0deeedc54964b62911276c41cc@thebighonker.lerctr.org> In-Reply-To: <201607201659.u6KGxaNs010929@repo.freebsd.org> References: <201607201659.u6KGxaNs010929@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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?7d98bc0deeedc54964b62911276c41cc>