[DynInst_API:] the cause of uninstrumentable functions


Date: Thu, 12 Feb 2015 18:14:47 +0100
From: Victor van der Veen <vvdveen@xxxxxxxxx>
Subject: [DynInst_API:] the cause of uninstrumentable functions
Hi,

I'm using the DyninstAPI to instrument a number of libc functions on my
x86-64 machine. This is working successfully most of the time, but some
functions are unfortunately rendered not-instrumentable by Dyninst
(isInstrumentable() returns false). I also noticed that calling
BPatch_function->findPoint(BPatch_exit) for these functions does not
return much either. I now assume that Dyninst is having problems
generating a CFG for these functions.

I'm wondering if anyone has seen similar issues and can perhaps explain
why this is happening. Does Dyninst indeed have problems rendering a
CFG? Example libc functions that are causing issues are:

free (__cfree)
strncmp (__GI___strncmp_ssse3)
memcmp (__memcmp_sse4_1)
strcmp (__strcmp_ssse3)

As you can see these are mostly optimized implementations. When looking
at the disassembly of libc (using objdump), I wonder if Dyninst has
perhaps problems interpreting certain nop code? For example:

   83a75:   66 66 2e 0f 1f 84 00    data32 nopw %cs:0x0(%rax,%rax,1)
   83a7c:   00 00 00 00
   
Could it be the case that Dyninst is interpreting this as data which
then cause a faulty CFG to be generated?

I will have a more detailed look later to see if there are other ways
for me to still instrument these functions, but I figured that someone
here perhaps has an answer already.

I'm running Ubuntu 14.04 and Dyninst 8.1.2.

Cheers,
Victor


[← Prev in Thread] Current Thread [Next in Thread→]