我正在为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位编译器会添加这些“调用”指令呢?任何帮助表示赞赏。
答案 0 :(得分:4)
您在32位反汇编中看到的内容可能是使代码与位置无关的一种方法。请记住,call
将返回地址推入堆栈,该地址等于eip
+常量?在64位模式下,有rip
- 相对寻址。在32位中没有。因此,此调用可以模拟指令指针相对寻址。
答案 1 :(得分:0)
下一个字节的调用指令来自“gprof”工具的功能分析。通过从编译中删除“-pg”选项,我能够摆脱这些“调用”指令。
由于它是一个驱动程序,因此从Linux内核配置中获取 - CONFIG_FUNCTION_TRACER。