Jump to registers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,
I am writing my Computer Engineering Thesis and I came across a 
doubt I couldn't figure out.

I am trying to statically instrument x86 
(both 32 and 64) software to trace memory accesses.

I wrote a byte-per-
byte parser which identifies what instructions will write into memory. 
Then, the software groups contiguous instructions to reach a size in 
byte >= 5, then replaces them with a call to a particular monitoring 
function and a bunch of nops, and copies the original instruction in a 
table for future execution.

Everything's working fine except for one 
scenario:
mov $i, %eax
incl (%eax)
jmp .FancyFunction

The incl (%eax) 
is a 2 byte instruction, the instrumented code would result in:

mov 
$i, %eax
call MyFunction
nopw

If somewhere else in the code there is a 
jmp to the third line of this example (jmp .FancyFunction), eip will 
point in the middle of the address of the call, in the best case 
arising a SIGILL signal, in the worst case producing undefined 
behaviour.

For static jump I can (mostly easily) hijack the jmp to the 
point where the original instruction has been moved.

If gcc produces 
such code:
jmp *%eax
or
jmp *(%eax)

there would be a complete mess: I 
should make a syntactic analysis of the code to understand what is 
going to be stored in registers, which is an unapplicable approch in my 
point of view.

So, the final question is: when does gcc produces that 
kind of jumps? Is it possible to tell gcc to avoid generation of such 
code?

Thanks a lot!
Alessandro Pellegrini

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux