[DynInst_API:] [dyninst/dyninst] 4ca18d: fix insnCodeGen::modifyData's 64-bit conversion


Date: Tue, 30 Aug 2016 12:36:50 -0700
From: Josh Stone <jistone@xxxxxxxxxx>
Subject: [DynInst_API:] [dyninst/dyninst] 4ca18d: fix insnCodeGen::modifyData's 64-bit conversion
  Branch: refs/heads/master
  Home:   https://github.com/dyninst/dyninst
  Commit: 4ca18d9e66dd8f9ffd12ac8fcd3386127db8d182
      https://github.com/dyninst/dyninst/commit/4ca18d9e66dd8f9ffd12ac8fcd3386127db8d182
  Author: Josh Stone <jistone@xxxxxxxxxx>
  Date:   2016-08-30 (Tue, 30 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.


[← Prev in Thread] Current Thread [Next in Thread→]
  • [DynInst_API:] [dyninst/dyninst] 4ca18d: fix insnCodeGen::modifyData's 64-bit conversion, Josh Stone <=