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-head mailing list