2

我正在为 32 位和 64 位 Linux 操作系统创建驱动程序。要求之一是所有代码都必须是自包含的,没有调用。在 64 位上我没有问题,但在 32 位 GCC 上似乎将调用指令添加到下一个字节。经过一番搜索,我找到了这个链接:

http://forum.soft32.com/linux/Strange-problem-disassemble-shared-lib-ftopict439936.html

有没有办法在 32 位 Linux 上禁用它?

示例:32 位反汇编:

<testfunc>:
0: push %ebp
1: mov  %esp, %ebp
3: call 4 <test_func+0x4>
<...some operation on ebx as mentioned in the link above>

64 位拆卸:

<testfunc>:
    0: push %rbp
    1: mov  %rsp, %rbp
    3: <...no call here>

“testfunc”中根本没有调用。即便如此,为什么 32 位编译器还要添加这些“调用”指令?任何帮助表示赞赏。

4

2 回答 2

4

您在 32 位反汇编中看到的可能是一种使代码与位置无关的方法。还记得call将返回地址压入堆栈,它等于eip+ 常量吗?在 64 位模式下,存在rip相对寻址。在 32 位中没有。所以这个调用可能是模拟指令指针相对寻址。

于 2012-06-28T17:32:35.210 回答
0

此对下一个字节的调用指令来自“gprof”工具的函数分析。通过从编译中删除“-pg”选项,我能够摆脱这些“调用”指令。

由于它是一个驱动程序,因此它是从 Linux 内核配置 - CONFIG_FUNCTION_TRACER 中获取的。

于 2012-07-11T23:03:41.380 回答