fix insnCodeGen::modifyData's 64-bit conversion
authorJosh Stone <jistone@redhat.com>
Sat, 27 Aug 2016 00:42:54 +0000 (17:42 -0700)
committerJosh Stone <jistone@redhat.com>
Tue, 30 Aug 2016 19:22:16 +0000 (12:22 -0700)
commit4ca18d9e66dd8f9ffd12ac8fcd3386127db8d182
treefbbdbfc0ccaa5bfdc1c4ba26584277235438d7b8
parenta032945f8f2b090ca63a5984123797695b916151
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.
dyninstAPI/src/codegen-x86.C