【发布时间】:2012-10-26 04:43:42
【问题描述】:
他们说 main() 是一个与任何其他函数一样的函数,但被“标记”为二进制文件中的入口点,操作系统可能会找到的入口点 (Don '不知道如何)并从那里启动程序。因此,我正在尝试了解有关此功能的更多信息。我做了什么?我创建了一个简单的 .C 文件,其中包含以下代码:
int main(int argc, char **argv) {
return (0);
}
我保存了文件,安装了 GCC 编译器(在 Windows,MingW 环境中)并创建了一个批处理文件,如下所示:
gcc -c test.c -nostartfiles -nodefaultlibs -nostdlib -nostdinc -o test.o
gcc -o test.exe -nostartfiles -nodefaultlibs -nostdlib -nostdinc -s -O2 test.o
@%comspec%
我这样做是为了获得一个非常简单的编译器和链接器,没有库,没有头文件,只有编译器。因此,编译顺利,但链接停止并出现此错误:
test.c:(.text+0xa): undefined reference to '___main'
collect2.exe: error: Id returned 1 exit status
我认为主函数是由链接器导出的,但我相信您不需要任何包含有关它的附加信息的库。但它看起来确实如此。就我而言,我认为它必须是标准的 GCC 库,所以我下载了它的源代码并打开了这个文件:libgcc2.c 现在,我不知道这是否是构建主函数以由 GCC 链接的文件。其实我不明白 GCC 是怎么使用 main 函数的。为什么链接器需要 gcc 标准库? 想知道 main 是怎么回事?我希望这让我的问题变得非常具体和清晰。谢谢!
【问题讨论】:
-
你能从你的windows运行
nm test.o吗?它会告诉你test.o中包含的符号 -
是的,有一个 '___main' 和 '_main' 符号(这很奇怪)