c - 尝试了解 GCC 和 Windows 的主要功能

标签 c windows gcc export program-entry-point

他们说 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

我认为 main 函数是由链接器导出的,但我相信您不需要任何包含有关它的附加信息的库。但看起来确实如此。在我的例子中,我认为它一定是标准的 GCC 库,所以我下载了它的源代码并打开了这个文件:libgcc2.c 现在,我不知道这是否是构造主要函数以供 GCC 链接的文件。其实我不明白GCC是怎么使用main函数的。为什么链接器需要 gcc 标准库? 知道 main 怎么样? 我希望这让我的问题变得非常具体和清楚。谢谢!

最佳答案

当 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

关于c - 尝试了解 GCC 和 Windows 的主要功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13247493/

相关文章:

java - Selenium 作为 Windows 服务运行以截取错误的屏幕截图

c++ - cout 是否同步/线程安全?

c - 如何在 C 中从 malloc 转换为指针数组

c - STM32L0读出保护示例代码?

c - 如何在c中获取时间戳

c++ - 使用 ICU_REJECT_USERPWD 标志集调用 WinHttpCreateUrl 在 Windows 7 中工作,但在 Windows XP 中不工作(使用虚拟 PC)

windows - 在目标机器上运行 CodeSigned powershell 脚本

c - linux 上的段错误-在 windows 上工作

c++ - 混合 C C++ 代码时动态库中的链接问题

c - 设置 UART 中断以在接收到字符时触发