Function 如何获取C函数编译到的字节数?

Function 如何获取C函数编译到的字节数?,function,gcc,Function,Gcc,假设我使用gcc编译C源代码,是否可以知道每个用户定义函数编译到多少字节?生成的ELF二进制文件包含函数符号的符号地址(假设该二进制文件未被剥离),但是否可以检索函数最后一个字节的地址 我需要这些信息的原因是我需要为ELF二进制文件编写一个小的静态模糊器/加密器。反转/拆解是我目前正在采用的次优解决方案。寻找功能尾声确实不是很可靠的解决方案。但是,作为编译过程的一部分,gcc可以很容易地吐出这些信息。所有编译器都将函数大小和其他花边的信息放在符号表中。使用nm检查此姓名列表。例如,要查找inde

假设我使用gcc编译C源代码,是否可以知道每个用户定义函数编译到多少字节?生成的ELF二进制文件包含函数符号的符号地址(假设该二进制文件未被剥离),但是否可以检索函数最后一个字节的地址


我需要这些信息的原因是我需要为ELF二进制文件编写一个小的静态模糊器/加密器。反转/拆解是我目前正在采用的次优解决方案。寻找功能尾声确实不是很可靠的解决方案。但是,作为编译过程的一部分,gcc可以很容易地吐出这些信息。

所有编译器都将函数大小和其他花边的信息放在符号表中。使用
nm
检查此姓名列表。例如,要查找
indent
可执行文件的
main
函数的大小(不能剥离),请使用

“T”表示文本段中的公共符号。
main
函数的长度为0x51d字节


您的手册页包含所有详细信息。顺便说一句,您还可以对对象文件运行
nm
,这些文件通常不会被剥离。

这不是答案。我已经很多年没有做过这种事情了,但是根据我的记忆,你必须搜索展开堆栈的操作码,也就是函数结束的地方,然后从开始减去。我在编程时没有意识到工具。使用函数部分并检查它们的大小。更重要的问题是:你为什么想知道它?我闻到了一个XY问题。一旦你得到了这些信息,假设这些信息在某种程度上是可用的,你打算怎么处理这些信息呢?简短的回答:不是真的。如果您仅使用GCC+glibc编译helloworld,那么根据您的编译器/lib选择,仅仅
#include
将添加大量指令。只需比较使用gcc+glibc、gcc+-std=c99(而不是gnu99)和clang+LLVM编译后得到的二进制文件。您可以检查程序集的大小,但编译后的二进制文件是另一回事—您计划使用哪些其他工具。例如,如果我将编译后的可执行文件放入disassembler(比如idapro),我可以看到每个函数的起始地址和结束地址。一点数学知识将给出以字节为单位的程序集大小。准确是最有意义的。谢谢
$ nm -AP indent|grep " main "
indent: main T 0000000000401600 000000000000051d