[DynInst_API:] [dyninst/dyninst] 2ef16d: fix insnCodeGen::modifyData's 64-bit conversion


Date: Tue, 30 Aug 2016 12:08:53 -0700
From: Josh Stone <cuviper@xxxxxxxxx>
Subject: [DynInst_API:] [dyninst/dyninst] 2ef16d: fix insnCodeGen::modifyData's 64-bit conversion
  Branch: refs/heads/v9.2_patches
  Home:   https://github.com/dyninst/dyninst
  Commit: 2ef16d80916233c55e2694af373adb69a863933c
      https://github.com/dyninst/dyninst/commit/2ef16d80916233c55e2694af373adb69a863933c
  Author: Josh Stone <jistone@xxxxxxxxxx>
  Date:   2016-08-26 (Fri, 26 Aug 2016)

  Changed paths:
    M dyninstAPI/src/codegen-x86.C

  Log Message:
  -----------
  fix insnCodeGen::modifyData's 64-bit conversion

On RHEL6 with a prelinked `/lib64/libc-2.12.so`, all of tests involving
fork instrumentation were getting SIGSEGV in the mutatee.  This worked
in 9.1, and it also works fine after `prelink -u` to undo libc.  Using
git-bisect found 2b86eb4577bb as the point of regression.

It seems prelink ends up with libc sitting far away from the relocation
buffer, more than a 32-bit displacement, so `insnCodeGen::modifyData`
decides to rewrite that to a 64-bit immediate.  To do this, it has to
emit additional instructions first.  But after the commit above, part of
the rewritten instruction has already been written when we're trying to
emit those extras, and things gets clobbered.

This patch emits those preamble instructions first, before any part of
the newly rewritten instruction is copied out.


  Commit: c3db2bda113dff501862928bcf4f2efbc531f520
      https://github.com/dyninst/dyninst/commit/c3db2bda113dff501862928bcf4f2efbc531f520
  Author: Josh Stone <cuviper@xxxxxxxxx>
  Date:   2016-08-30 (Tue, 30 Aug 2016)

  Changed paths:
    M dyninstAPI/src/codegen-x86.C

  Log Message:
  -----------
  Merge pull request #163 from cuviper/modify-data-64

fix insnCodeGen::modifyData's 64-bit conversion


Compare: https://github.com/dyninst/dyninst/compare/9d5a42622dfd...c3db2bda113d
[← Prev in Thread] Current Thread [Next in Thread→]
  • [DynInst_API:] [dyninst/dyninst] 2ef16d: fix insnCodeGen::modifyData's 64-bit conversion, Josh Stone <=