-u
选项仅与归档(.a
)库有关(也可能与--as-needed
一起使用的.so
库)。
与链接命令行中出现的单个目标文件(.o
)按照它们出现的顺序全部链接不同,归档库中的目标文件仅在它们出现在链接命令行顺序的某一点满足一个或多个未定义符号引用时才链接。一旦从归档中提取了一个.o
文件进行链接,递归地重复这个过程,因此如果它引入了更多未定义符号引用,则会从同一(或稍后)归档中提取其他目标文件来满足这些符号引用。
使用-u
允许你将特定符号(及其间接依赖的所属目标文件)引入链接中。当然,你也可以直接在命令行中放置所有.o
文件,而不使用任何归档库,但是通过使用库,你可以在获取所需的文件的同时,避免链接未使用的目标文件(这在大部分代码根据构建时间可配置设置在其他文件中而可能未被使用时尤其有用!)。
main
(通过crt1.o
)为根的未定义符号依赖关系树就足以获取所需的所有内容。但是对于像内核这样的独立项目,您可能需要定义自己的根。另外,无论哪种方式——但这在裸机/内核编程中更常见,在其中可以对链接器进行假设的情况下,不属于主符号依赖关系树的对象文件可能会通过链接器脚本插入到表中的特殊部分来发挥作用等最终生成的结果。 - R.. GitHub STOP HELPING ICE
main()
函数被调用的方式是因为启动代码 (crt0.o
或类似文件) 调用了该函数 —— 但没有定义它,因此链接器会在您的目标文件中寻找定义。--undefined=symbol
选项告诉链接器应在扫描的目标文件和库中查找symbol
。我还没有检查过它在链接器命令行上的位置是否重要。如果符号已经被定义,那么它就不重要(也不会再次链接)。如果在链接结束时仍未定义,则链接可能会失败。 - Jonathan Leffler