Date: Mon, 30 Sep 2019 01:36:23 +0300 From: Oleksandr Rybalko <ray@ddteam.net> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r352875 - head/contrib/elftoolchain/elfcopy Message-ID: <CAJ1Oi8HML4HjO9ALd_MGuQUWCiS_EcT%2BbqEtnS0MQ-V_3g=5RQ@mail.gmail.com> In-Reply-To: <201909292234.x8TMY260090143@repo.freebsd.org> References: <201909292234.x8TMY260090143@repo.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Should be "Put sections into expected offset in binary format." Sorry. пн, 30 вер. 2019 о 01:34 Aleksandr Rybalko <ray@freebsd.org> пише: > Author: ray > Date: Sun Sep 29 22:34:01 2019 > New Revision: 352875 > URL: https://svnweb.freebsd.org/changeset/base/352875 > > Log: > ections into expected offset in binary format. > Calculate binary file offset using address field, bacause software know > only offset to known data, not where to load segment. > With that patch, kernel .data section can have any alignment/offset - > kernel boor fine. > > PR: 235391 > Reviewed by: markj > MFC after: 1 month > Differential Revision: D21827 > > Modified: > head/contrib/elftoolchain/elfcopy/binary.c > > Modified: head/contrib/elftoolchain/elfcopy/binary.c > > ============================================================================== > --- head/contrib/elftoolchain/elfcopy/binary.c Sun Sep 29 20:44:13 2019 > (r352874) > +++ head/contrib/elftoolchain/elfcopy/binary.c Sun Sep 29 22:34:01 2019 > (r352875) > @@ -49,22 +49,23 @@ create_binary(int ifd, int ofd) > Elf *e; > Elf_Scn *scn; > Elf_Data *d; > + Elf64_Addr baseaddr; > GElf_Shdr sh; > - off_t base, off; > + off_t baseoff, off; > int elferr; > > if ((e = elf_begin(ifd, ELF_C_READ, NULL)) == NULL) > errx(EXIT_FAILURE, "elf_begin() failed: %s", > elf_errmsg(-1)); > > - base = 0; > - if (lseek(ofd, base, SEEK_SET) < 0) > + baseoff = 0; > + if (lseek(ofd, baseoff, SEEK_SET) < 0) > err(EXIT_FAILURE, "lseek failed"); > > /* > * Find base offset in the first iteration. > */ > - base = -1; > + baseoff = -1; > scn = NULL; > while ((scn = elf_nextscn(e, scn)) != NULL) { > if (gelf_getshdr(scn, &sh) == NULL) { > @@ -76,14 +77,16 @@ create_binary(int ifd, int ofd) > sh.sh_type == SHT_NOBITS || > sh.sh_size == 0) > continue; > - if (base == -1 || (off_t) sh.sh_offset < base) > - base = sh.sh_offset; > + if (baseoff == -1 || (off_t) sh.sh_offset < baseoff) { > + baseoff = sh.sh_offset; > + baseaddr = sh.sh_addr; > + } > } > elferr = elf_errno(); > if (elferr != 0) > warnx("elf_nextscn failed: %s", elf_errmsg(elferr)); > > - if (base == -1) > + if (baseoff == -1) > return; > > /* > @@ -110,8 +113,8 @@ create_binary(int ifd, int ofd) > if (d->d_buf == NULL || d->d_size == 0) > continue; > > - /* lseek to section offset relative to `base'. */ > - off = sh.sh_offset - base; > + /* lseek to section offset relative to `baseaddr'. */ > + off = sh.sh_addr - baseaddr; > if (lseek(ofd, off, SEEK_SET) < 0) > err(EXIT_FAILURE, "lseek failed"); > > -- WBW ------- Rybalko Aleksandr <ray@ddteam.net>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ1Oi8HML4HjO9ALd_MGuQUWCiS_EcT%2BbqEtnS0MQ-V_3g=5RQ>
