【发布时间】:2020-02-06 19:39:09
【问题描述】:
对于一个学校项目,我必须在汇编中进行大量的字符串操作。由于这样做很痛苦,我试图想出创新的方法来使用已经编程的字符串操作。我的想法是从 c 中的string.h 库中编译和转储程序集。然后我会将转储的程序集复制粘贴到我的程序中。在弄清楚每个函数的内存位置及其参数后,我想我基本上可以调用该函数了。
为了转储程序集,我首先编写了一个包含我想要的库的程序:
#include <stdio.h>
#include <string.h>
int main() {
return 0;
}
然后我编译并转储程序集使用
gcc -o lib lib.c
objdump -d *o
当我查看输出时,我注意到它不包含库的任何程序集。我的猜测是编译器优化不包括未使用的函数,或者当我使用 objdump 时库输出被隐藏:
lib: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
__text:
100000fa0: 55 pushq %rbp
100000fa1: 48 89 e5 movq %rsp, %rbp
100000fa4: 31 c0 xorl %eax, %eax
100000fa6: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
100000fad: 5d popq %rbp
100000fae: c3 retq
_main:
100000fa0: 55 pushq %rbp
100000fa1: 48 89 e5 movq %rsp, %rbp
100000fa4: 31 c0 xorl %eax, %eax
100000fa6: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
100000fad: 5d popq %rbp
100000fae: c3 retq
顺便说一句,我正在运行 OSX Catalina,但如果更容易的话,我可以切换到 Ubuntu 或其他操作系统。
如何转储 string.h 库的 asm?
【问题讨论】:
-
仅包含 .h 文件不会向程序添加任何函数,除非您实际调用它们。同样调用库函数不会将程序集添加到您的程序中,它只是链接到共享库文件中的程序集。
-
请注意,gcc 具有某些字符串函数的内置函数,因此启用优化后,您很可能会内联代码(如果您使用该函数)。如果您对库版本感兴趣,您当然可以反汇编库本身,而无需编译任何东西。
-
(跳出框框思考的要点。除非你真的应该为那个学校练习自己写它......)应该也可以转储标准库的内容。跨度>
-
您可以直接查看源代码并尝试编译,而不是包含它:Linux string.c
-
@Frederik 该链接与标准 C 库无关。