如何为c库(string.h)编译和转储程序集?

问题描述 投票:1回答:1

对于一个学校项目,我必须在组装中进行大量的字符串操作。由于这样做很痛苦,因此我试图提出创新的方法来使用已编程的字符串操作。我的想法是从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?

c gcc assembly objdump
1个回答
0
投票

头文件(例如string.h)通常不包含[[not)包含函数定义。它仅包含其声明。实际函数实际上是已经编译到动态库对象中,该对象已安装在系统中(即库本身)。

编译程序时,编译器会自动将其链接到标准C库。根据this answer,在OS X中,标准库应位于/usr/lib/libSystem.B.dylib

[如果要查看特定库函数的反汇编,可以在将其管道传递到objdump的库中运行less,然后搜索函数名称:

$ objdump -d /usr/lib/libSystem.B.dylib | less

less内时,您可以通过键入/和功能名称进行搜索,然后按

Enter并使用nN来浏览匹配项。

或者,您可以将objdump的输出转储到文件中,并使用文本编辑器进行检查:

$ objdump -d /usr/lib/libSystem.B.dylib > libSystem.disasm

做这种事情的问题是,标准库与string.h中看到的名称相比,具有许多不同且更复杂的标准函数名称。在内部,使用的符号是不同的。例如,在Linux中,当使用C99和scanf()时,libc中的相应符号实际上是__isoc99_sscanf
© www.soinside.com 2019 - 2024. All rights reserved.