我正在为32位和64位Linux操作系统创build驱动程序。 其中一个要求就是所有的代码都需要自己包含,而且没有任何呼叫。 在64位我没有问题,但在32位GCC似乎添加到下一个字节的调用指令。 search了一下后,我发现这个链接:
http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html
有没有办法在32位Linux上禁用这个function?
例如: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位编译器添加这些“调用”指令? 任何帮助表示赞赏。
你在32位反汇编中看到的可能是使代码独立于位置的一种方法。 请记住, call
堆栈返回地址,这是相等的eip
+常量? 在64位模式下,有相对地址寻址。 在32位没有。 所以这个调用可以模拟指令指针相对寻址。
这个对下一个字节的调用指令来自“gprof”工具的函数分析。 我可以通过从编译中删除“-pg”选项来摆脱这些“调用”指令。
由于它是一个驱动程序,这是从Linux内核配置 – CONFIG_FUNCTION_TRACER被拿起。