C语言宣讲会:tcc编译与链接探索

需积分: 0 0 下载量 199 浏览量 更新于2024-08-04 收藏 3.26MB DOCX 举报
"C语言一二三宣讲会研究报告,探讨了C语言的编译和链接过程,通过实例验证了Tiny C Compiler (TCC) 的工作原理。" 在C语言编程中,编译和链接是两个关键步骤,它们将源代码转换为可执行程序。在这个宣讲会的研究报告中,作者通过具体的实验过程,深入浅出地解释了这两个过程。 首先,报告提到了基础的编译步骤。当使用TCC(Tiny C Compiler)编译`hello.c`文件时,TCC会执行以下操作: 1. 将源代码`hello.c`编译成中间目标文件`hello.obj`。这个阶段,TCC将源代码转换为机器码,但还没有完全形成可执行文件。 2. 接下来,链接器`tlink.exe`将`hello.obj`与其他必要的库文件链接,生成最终的`hello.exe`可执行程序。这个过程包括解析函数调用和其他外部引用,将它们与正确的函数实现连接起来。 在验证过程中,作者尝试移除了链接阶段所需的`.lib`和`.obj`文件,并发现TCC仍然能够生成`hello.obj`。这表明TCC内部可能集成了链接器功能,可以在没有外部链接器的情况下完成编译和链接。 然后,作者替换`tcc.exe`为`tlink.exe`,试图仅用链接器生成`hello.exe`。令人惊讶的是,尽管缺少了`.lib`和`.obj`文件,链接器仍能生成可执行文件,但运行时出现了问题,即所谓的“一闪一闪亮晶晶”现象,这通常是由于链接错误导致的。 进一步实验发现,即使添加了`.lib`和`.obj`文件,相同的链接错误仍然存在,同时多了一个`hello.map`文件。`hello.map`是链接器生成的映射文件,它提供了可执行文件中符号的内存布局信息。对于大型项目,这个文件有助于理解各个部分的分布,但在小型项目中可能不太必要。 出现“undefined symbol `_PRINTF` in module `HELLO.C`”错误意味着链接器找不到`printf`函数的定义,这是因为在没有标准C库的情况下尝试调用了`printf`。通常,`printf`函数在`libc.lib`或类似的库中定义,但在这个实验环境中,链接器未能正确链接到包含`printf`定义的库。 这个研究报告揭示了C语言编译和链接的细节,以及TCC如何作为一个紧凑的工具,同时处理编译和链接任务。同时,它也提醒我们在实际开发中确保正确配置和使用编译器和链接器,以避免未定义符号等链接错误。