如何从ELF和PE文件中找到所有的“用户定义函数”?

4

测试平台是32位Linux和Windows。

我正在尝试识别所有用户定义的函数,以便于动态链接二进制文件,提取它们的指令并将其重新组装成二进制文件。

至于ELF文件,我使用以下方法:

nm binary | grep "T"

提取特定的函数,我认为所有以_开头的函数都应该是用户自定义的函数。
对于小型程序它可以正常工作...
但是当我测试coreutils(8.5)时,例如basename,
这里是nm命令的部分输出。
0804b530 T rpl_fflush
0804b590 T rpl_fseeko
0804a400 T set_char_quoting
0804a480 T set_custom_quoting
08049580 T set_program_name
0804a460 T set_quoting_flags
0804a3e0 T set_quoting_style
08049480 T strip_trailing_slashes
08048f70 T usage
0804b0f0 T version_etc
0804b6c0 T atexit

basename 的源代码中,仅定义了三个函数,它们是:
main
usage
remove_suffix

但是我使用nm在这里找到了很多函数...

基本上,我认为这些函数像version_etc *atexit* 这样的函数都在头文件中定义,包括basename。

所以我的问题是:

如何准确地从ELF文件中找到所有用户定义的函数?

对PE文件的任何答案也欢迎!

谢谢!


1
ELF 文件包含所有链接到其中的函数,包括从静态库中链接进来的内容。你想做的唯一可能性就是查看 ELF 中包含的调试信息并猜测。 - Mat
1个回答

1
基本上,我认为这些函数,如version_etcatexit在头文件basename中被定义。
您对basename构建方式的心理模型似乎完全不正确。 basename是由basename.o和一堆其他对象(这些对象是coreutils的一部分)以及从其他库中提取的更多对象组成的。
一旦链接了basename,就无法知道哪些功能来自何处。
此外,“用户定义的函数”是什么意思?

你好,基本上我正在尝试将反汇编的汇编文件重新组装成二进制文件。现在我卡在链接步骤了……我的目标是选择所有不在libc中的函数,对它们进行汇编,并使用gcc将obj文件与libc链接起来。 - lllllllllllll
至于“用户自定义函数”,我指的是在反汇编文件中找到的函数,而不是在libc中找到的函数。 - lllllllllllll
我认为,由于该二进制文件是动态链接的,因此在反汇编的文件中找到的所有函数都应该是“用户定义函数”。但是,在反汇编的文件中,我发现了像“rpl_fflush”和“atexit”这样的函数,它们没有在basename.c文件中出现。因此,我认为它们应该在包含的头文件中。 - lllllllllllll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接