On 10/01/2015 08:51 AM, chenping
wrote:
Hello, Dyninst developers
ÂÂÂÂ I am using Dyninst to statically
instrument the binary. Our work heavily depends on the
correctness of the basic block recognization. So I would
like to guarantee/know if there is any basic block
cannot be correctly recognized.
Any function that is marked "instrumentable" is one for which we
have correct basic blocks (or in the worst case, overzealous
block splitting as a result of conservative indirect control
flow analysis. Any function marked "uninstrumentable" is one
that has unresolved indirect control flow, and requires dynamic
techniques if you want to ensure that instrumentation is both
safe and comprehensive at the block level: insert a
dynamicTargetExpr at the indirect branch, and follow the control
flow targets that it reveals. It is also possible for us to
create incorrect basic blocks in a binary that has been stripped
if our gap parsing algorithm yields a false positive, but the
blocks that creates will be consistent with the function entry
point we've (incorrectly) chosen, and in practice the code is
likely to realign quite quickly.
Aside from stripped code and indirect control flow, I am not
aware of any other reason we could have incorrect basic block
boundaries. There are certain code idioms (getPC thunks, for
example) that we elide and merge, but that's a deliberate
choice. Likewise, we elide PLT stubs by choice.
ÂÂÂÂÂÂDo you have any method to
automatically find the incorrect basic blocks? Or from
your experience, is there any scenario when Dyninst
cannot recognize the basic blocks correctly? If the
basic blocks cannot be correctly recognized, is there
method can guarantee the instrumented program works at
runtime?
Any instrumentation we insert should be inserted safely: in
functions that do not have complete control flow graphs,
instrumentation should be reached by traps (expensive, but
safe). However, if your instrumentation depends on block
entry/exit being paired correctly in order to function, you will
probably want to restrict your instrumentation to functions that
can be safely relocated.
ÂÂÂÂÂ I am very appreciated
for your help. Thanks!~
Bests,
Ping