对于一个学校项目,我必须在组装中进行大量的字符串操作。由于这样做很痛苦,因此我试图提出创新的方法来使用已编程的字符串操作。我的想法是从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?
头文件(例如string.h
)通常不包含[[not)包含函数定义。它仅包含其声明。实际函数实际上是已经编译到动态库对象中,该对象已安装在系统中(即库本身)。
/usr/lib/libSystem.B.dylib
。[如果要查看特定库函数的反汇编,可以在将其管道传递到objdump
的库中运行less
,然后搜索函数名称:
$ objdump -d /usr/lib/libSystem.B.dylib | less
在less
内时,您可以通过键入/
和功能名称进行搜索,然后按Enter并使用n或N来浏览匹配项。
或者,您可以将objdump
的输出转储到文件中,并使用文本编辑器进行检查:
$ objdump -d /usr/lib/libSystem.B.dylib > libSystem.disasm
做这种事情的问题是,标准库与string.h
中看到的名称相比,具有许多不同且更复杂的标准函数名称。在内部,使用的符号是不同的。例如,在Linux中,当使用C99和scanf()
时,libc中的相应符号实际上是__isoc99_sscanf
。