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.
|