2016-12-29 422 views
4

据说linux loader是/ usr/bin/ld,但通常我们使用gcc/g ++来链接库和可执行文件,我们几乎不使用“ld”。“gcc链接”和“ld链接”之间有什么关系?

我最后一次用“LD”当我学习linux装配手动为,以生成可执行的唯一方法是LD .o文件生成可执行的情况下直接任意库。

我的问题是,是包含“LD”的一些功能包装GCC/G ++,因为原始的“LD”是太难用?或者我们不应该明确地使用“ld”作为c/C++程序链接,因为blablabla?

非常感谢。

+0

另请参阅[当我应该使用ld而不是gcc?](http://stackoverflow.com/q/36680470),[将C++代码与'gcc'(不含g ++)](http:// stackoverflow。 com/q/1001535)和朋友。 – jww

回答

6

gcc提供了几个默认选项ld

ld不知道C++,或其他任何语言的任何东西。 ld不知道你的代码需要链接什么库。如果您尝试直接将编译后的C++代码与ld链接起来,它将会帮助您,因为ld本身并不知道它在哪里可以找到gcc的C++运行时库libstdc++。你使用字符串吗?引导?其中大部分是作为对象模块的一部分进行编译的模板代码。但是还有一些预编译位在libstdc++之内,需要与之链接。

当你给gcc编译的代码链接时,gcc会有礼貌地把你的所有文件一起传递给ld,并告诉ld除了你明确指定的那些库之外,哪些库。

你可以直接链接ld,如果你愿意,只要你指定相同的库和链接选项gcc使用。但你为什么要这么做?只需使用gcc链接你的gcc编译的代码。

2

我的问题是,是包含 “LD”

这是正确的一些功能包装GCC/G ++。

,因为原始的 “LD” 是太难用?

嗯,不是真的;你可以自己使用它,但也不会太麻烦,但是通过一个可执行文件,一组标志以及一个命令来管理整个构建过程是很方便的。

如果你绕过了包装器(尽管我没有测试过),你也可能必须自己提供一些运行时库(例如libstdC++。a)的绝对路径。

或者我们不应该明确地使用“ld”作为c/C++程序链接,因为blablabla?

你可以自由地做,如果你想要的。人们可能会扬眉吐气的唯一原因是问你为什么不按传统方式做。如果您有充分的理由直接调用ld,而不是通过g++并通过任何链接器标志,那就马上行动吧!

2

您不应该尝试直接使用ld来链接C++程序,因为您需要知道C++运行时库静态部分所在位置的实现细节。 g++知道这些实现细节,例如在哪里可以找到文件libstdc++.a。如果您试图直接使用ld,则必须提供所有这些“缺失”的静态库。

+0

你的意思是,即使我们默认使用libstdC++,那么libstdC++里面仍然有一些内容被静态链接到我们的可执行文件中?这些内容在做什么?谢谢。 – Troskyvs