Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gnuld--undefined选项做什么?_C_Gcc_Linker_Gnu_Ld - Fatal编程技术网

C gnuld--undefined选项做什么?

C gnuld--undefined选项做什么?,c,gcc,linker,gnu,ld,C,Gcc,Linker,Gnu,Ld,有人能解释一下GNU ld选项--undefined的作用吗 在一个项目上工作。该应用程序链接了许多-u选项。例如-utask\u shellcmd for--undefined=symbol简单地说: 强制将符号作为未定义的符号输入到输出文件中。例如,这样做可能会触发标准库中附加模块的链接 因此,该符号将作为未定义的符号包含在输出文件中。如果符号已在其中一个链接的obj文件中定义,该怎么办?如果它真的没有定义,什么时候会发生附加模块的链接,以及如何发生 只有当涉及存档(.a)库时,-u选项才相

有人能解释一下GNU ld选项
--undefined
的作用吗

在一个项目上工作。该应用程序链接了许多
-u
选项。例如
-utask\u shellcmd

for
--undefined=symbol
简单地说:

强制将符号作为未定义的符号输入到输出文件中。例如,这样做可能会触发标准库中附加模块的链接


因此,该符号将作为未定义的符号包含在输出文件中。如果符号已在其中一个链接的obj文件中定义,该怎么办?如果它真的没有定义,什么时候会发生附加模块的链接,以及如何发生

只有当涉及存档(
.a
)库时,
-u
选项才相关(也可能是
。因此
库具有
——根据需要有效的

与链接命令行上的单个对象文件(
.o
)不同,这些文件都是按照它们的显示顺序链接的,而归档库中的对象文件只有在它们在链接命令行顺序中显示的点满足一个或多个未定义的符号引用时才被链接。一旦归档文件中的
.o
文件被拉入链接,该过程就会递归重复,这样,如果它引入了更多未定义的符号引用,那么来自相同(或更高版本)归档文件的其他对象文件将被拉入以满足它们


使用
-u
可以将特定符号(以及间接地将定义该符号的对象文件的所有依赖项)拉入链接。当然,您可以直接将所有
.o
文件放在命令行上,而不使用任何存档库,但通过使用库,您可以避免链接未使用的对象文件(如果代码的大部分可能未使用,这尤其有用,这取决于其他文件中的构建时可配置设置!)获取所需的对象时。

编译器查看您的翻译单元并创建一个已编译的对象文件。该文件的一部分是一个符号表,其中列出了对象文件引用的不属于该对象的外部符号。这些是未定义的符号。在正常托管环境中,调用
main()
的方式是因为启动代码(
crt0.o
或类似代码)调用函数,但没有定义它,因此链接器在对象文件中查找定义。
--undefined=symbol
选项告诉链接器应该在扫描的目标文件和库中查找
symbol
。我还没有检查它在链接器命令行上的位置是否重要。如果符号已定义,则无所谓(也不会再次链接)。如果在链接结束时它仍然未定义,链接可能会失败。基本上,它可能会导致未使用的符号链接到生成的二进制文件中。对的那么为什么需要这样做呢?@minghua:事实上,对于普通托管的应用程序,根在
main
(via
crt1.o
)的未定义符号依赖关系树足以满足您的所有需求。但是对于像内核这样的独立项目,您可能需要定义自己的根。此外,无论哪种方式-但这在裸机/内核编程中更常见,在裸机/内核编程中,对链接器进行假设是有效的-不属于主符号依赖关系树的对象文件可以通过链接器脚本插入到表中的特殊部分在最终输出中发挥作用,这是一个特殊的情况,它是可移植的,是静态对象的构造函数(C++中,或者通过GNU C属性,使一个函数在启动时运行)。拉入一个原本未使用的对象文件会导致该文件中的静态构造函数链接并在启动时运行,从而改变程序行为。