"gcc linking"和"ld linking"有什么关系?

What's the relationship between "gcc linking" and "ld linking"?

据说linux loader是/usr/bin/ld,但通常我们使用gcc/g++到link库和可执行文件,我们几乎不使用"ld" .

上次手动使用"ld"是在学习linux汇编时,生成可执行文件的唯一方法是ld一个.o文件直接生成可执行文件,不需要任何库。

我的问题是,gcc/g++ 是否包含 "ld" 的一些函数包装器,因为原始 "ld" 太难使用了?或者我们不应该明确地为 c/c++ 程序 linking 使用 "ld",因为 blablabla?

非常感谢。

gcc 为 ld.

提供了一些默认选项

ld 对 C++ 或任何其他语言一无所知。 ld 不知道您的代码 link 需要哪些库。如果您尝试直接使用 ld link 编译的 C++ 代码,它会帮您解决问题,因为 ld 本身不知道在哪里可以找到 libstdc++,gcc 的 C++运行时库。你使用字符串吗?矢量?其中大部分是作为目标模块的一部分编译的模板代码。但是在 libstdc++ 中还有一些预编译位需要 link 编辑。

当你将编译后的代码交给 gcc 给 link 时,gcc 会很礼貌地将你所有的文件传递给 ld,并告诉 ld 哪些库,此外对于您明确指定的任何人。

您可以 link 直接使用 ld,只要您指定相同的库和 link 选项 gcc 使用。但是你为什么要这样做呢?只需使用 gcc link 你的 gcc 编译的代码。

My question is, is gcc/g++ containing some function wrappers of "ld"

没错。

because raw "ld" is too difficult to use?

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

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

Or we should never use "ld" explicitly for c/c++ program linking, because of blablabla?

如果你愿意,你可以自由地这样做。人们可能会扬起眉毛的唯一原因是问你为什么不以传统方式做这件事。如果您有充分的理由直接调用 ld,而不是通过 g++ 并以这种方式传递任何链接器标志,那么请继续!

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