svn commit: r352875 - head/contrib/elftoolchain/elfcopy
Oleksandr Rybalko
ray at ddteam.net
Sun Sep 29 22:36:37 UTC 2019
Should be "Put sections into expected offset in binary format."
Sorry.
пн, 30 вер. 2019 о 01:34 Aleksandr Rybalko <ray at 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 at ddteam.net>
More information about the svn-src-all
mailing list