Linux 32位反汇编有下一个字节的调用指令

时间:2012-06-28 17:20:20

标签: linux gcc x86 32bit-64bit disassembly

我正在为32位和64位Linux操作系统创建驱动程序。其中一个要求是所有代码都需要自包含而不需要调用。在64位我没有问题,但在32位GCC似乎添加一个调用指令到下一个字节。搜索了一下后,我找到了这个链接:

http://forum.soft32.com/linux/Strange-problem-disassembling-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位disassebmly:

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

“testfunc”中根本没有调用。那么为什么32位编译器会添加这些“调用”指令呢?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

您在32位反汇编中看到的内容可能是使代码与位置无关的一种方法。请记住,call将返回地址推入堆栈,该地址等于eip +常量?在64位模式下,有rip - 相对寻址。在32位中没有。因此,此调用可以模拟指令指针相对寻址。

答案 1 :(得分:0)

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

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