如何找出大型项目中 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
相反。
假设我有以下程序 (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
相反。