如何在gdb中调用程序集?

时间:2011-03-30 01:20:12

标签: assembly gdb

在gdb中,我可以使用call来运行函数,但是如果我想运行一些额外的程序集呢?

2 个答案:

答案 0 :(得分:5)

在GCC 5 (1)之前,我不知道运行任意机器代码的方法,除非您实际将机器代码输入内存然后运行它。

如果你想在内存中运行已经的代码,你可以将指令指针设置为start,最后是断点,然后去。然后,在断点之后,将指令指针更改回其原始值。

但实际上我无法看到这个用例。这并不意味着不是,只要通过运行代码可以做任何事情,您也可以通过直接修改寄存器,标志,内存等来实现。

例如,命令:

info registers

将在以下情况下转储寄存器的当前值:

set $eax = 42

会将eax注册号更改为42

您还可以通过以下方式更改内存:

set *((char*)0xb7ffeca0) = 4

这会将单个字节写入内存位置0xb7ffeca0,您也可以使用相同的方法存储更广泛的数据类型。


(1) GCC 5允许您使用compile code命令编译和执行任意代码,如文档here所述。

答案 1 :(得分:0)

compile code命令

大约7.9引入,它允许代码编译和注入,文档:https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html

示例:

int main(void) {
    int i = 0;
    printf("%d\n", i);
    return 0;
}

然后在GDB中:

start
next
compile code int j = 1; i = j; asm("nop");
continue

节目输出:

1

为此,您需要最近的GDB和GCC 5.x.在GDB 7.9.1,GCC 5.1上测试,用:

export LD_LIBRARY_PATH="/path/to/gcc/install/lib64:$LD_LIBRARY_PATH"

以便libcc1.so可见:这是最近的GCC组件,它将C API公开给cc1编译器。

有一些结构不像我预期的那样有效return,所以我问过为什么:In the GDB compile code command, what language constructs behave exactly as if they were present in the original source?