ali*_*ali 0 c windows gcc program-entry-point export
他们说main()是一个像任何其他函数一样的函数,但是"标记"为二进制文件中的入口点,操作系统可能找到的入口点(不知道如何)并从那里启动程序.所以,我试图找到更多关于这个功能的信息.我做了什么?我在里面用这个代码创建了一个简单的.C文件:
int main(int argc, char **argv) {
return (0);
}
Run Code Online (Sandbox Code Playgroud)
我保存了文件,安装了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%
Run Code Online (Sandbox Code Playgroud)
我这样做是为了获得一个非常简单的编译器和链接器,没有库,没有头,只是编译器.所以,编译顺利,但链接停止与此错误:
test.c:(.text+0xa): undefined reference to '___main'
collect2.exe: error: Id returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我认为主要功能是由链接器导出的,但我相信你不需要任何有关它的附加信息的库.但看起来确实如此.在我的情况下,我认为它必须是标准的GCC库,所以我下载了它的源代码并打开了这个文件:libgcc2.c 现在,我不知道这是否是构造main函数的文件由GCC联系.事实上,我不明白GCC如何使用主要功能.为什么链接器需要gcc标准库?要知道主要的是什么?我希望这使我的问题非常具体和明确.谢谢!
当gcc将所有目标文件(test.o)和库放在一起形成二进制文件时,它还会预先设置一个小对象(通常是crt0.o或crt1.o),它负责调用你的main().当您-v在命令行上添加时,您可以看到gcc正在做什么:
$ gcc -v -o test.exe test.o
crt0/crt1进行一些设置然后调用main.但是链接器最终负责根据操作系统构建可执行文件.随着-v您还可以查看目标系统的选项.就我而言,它适用于Linux 64位:-m elf_x86_64.对于你的系统,这将是-m windows或类似的东西-m mingw.
| 归档时间: |
|
| 查看次数: |
2012 次 |
| 最近记录: |