aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksandr Rybalko <ray@FreeBSD.org>2019-09-29 22:34:01 +0000
committerAleksandr Rybalko <ray@FreeBSD.org>2019-09-29 22:34:01 +0000
commit0705bb9de50b128540428cb7f0e0b0ba8be77d55 (patch)
tree81c523fe56d1c1d81e4b9bf56bc0bb968b5a54ed
parent4093e719b42427cd03ce8d9f89fe0acfb3724190 (diff)
Notes
-rw-r--r--contrib/elftoolchain/elfcopy/binary.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/contrib/elftoolchain/elfcopy/binary.c b/contrib/elftoolchain/elfcopy/binary.c
index 64a851d96b05..954da5958247 100644
--- a/contrib/elftoolchain/elfcopy/binary.c
+++ b/contrib/elftoolchain/elfcopy/binary.c
@@ -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");