如何找出大型项目中 main() 的定义位置?

How do I find out where main() is defined in a big project?

假设我有以下程序 (a.c):

#include <stdio.h>

void f()
{
    printf("Hello, world!");
}

int main(void)
{
    f();
    return 0;
}
$ gcc -g a.c

有了 a.out,我如何找出 main() 的定义位置?我的意思是,在一个大项目中,并不总是清楚 main() 来自哪里。

您可以使用 gdb。可能有更好的命令,反正我知道:

$ gdb -batch -ex "info function main" a.out
All functions matching regular expression "main":

File a.c:
8:   int main(void);

在可执行文件中通常不是查找函数定义的地方。您可以对所有源文件和 运行 nm(1) 进行编译,以查看是否有任何文件具有 main 的定义。可执行文件不是正确的位置,因为它不会引用它来自的模块。源文件将很难遵循(因为有些可以有编译指令和可选的编译代码/带有 main 定义,以防你不提供一个/这将使你不确定你找到它的地方)但是已编译的模块将有一个对 main 的引用,以指示它可以获取它的链接器,并解决来自该文件的所有 main 引用。链接器将编译后的输入分成一组段,并将它们堆积到处理器内存映射中的适当位置,因此,您会得到一个混乱的最终可执行文件,每个模块的片段都混在一起,这使得检查是否main 有定义(它适用于 main 或任何其他函数)

输出应该是这样的:

0000000000000c10 T main

在包含它的文件中。相反,所有需要 main 并需要它由链接器提供的文件显示为:

                 U memset

相反。