当我应该使用ld而不是gcc?

时间:2016-04-17 18:27:06

标签: gcc linker ld

我想知道何时应该使用ld链接器代替gcc。我刚用c ++写了一个简单的hello world,当然我包含了iostream库。如果我想用gcc制作一个二进制文件,我只需使用:

g++ hello hello.cpp 我已经得到了我的二进制文件。

后来我尝试使用ld链接器。要获取目标文件我使用: g++ -c hello.cpp。好吧,这很容易,但链接命令很长很长:

ld -o hello.out  hello.o \
   -L /usr/lib/gcc/x86_64-linux-gnu/4.8.4/ \
   /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o \
   /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o \
   /usr/lib/x86_64-linux-gnu/crti.o \
   /usr/lib/x86_64-linux-gnu/crtn.o \
   /usr/lib/x86_64-linux-gnu/crt1.o \
   -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lstdc++ -lc 

我知道gcc 使用ld。 在所有情况下或仅在大多数情况下使用gcc会更好吗?请告诉我有关ld链接器有优势的案例的一些想法。

2 个答案:

答案 0 :(得分:8)

正如你所提到的,gcc在链接时只是作为ld的前端;它传递所有链接器指令(选项,默认/系统库等),并通过为您处理所有这些工具链特定的细节,确保所有内容完美地结合在一起。

我认为最好将GNU工具链视为一个整体,紧密集成的环境(因为任何具有为某些奇特嵌入式平台构建工具链的经验的人,例如,Dietlibc集成可能会同意)。

除非你有一些非常具体的平台集成要求,或者有理由不使用gcc,否则我很难想到直接调用ld进行链接的任何好处。您可能需要的任何额外的特定于链接器的选项都可以使用gcc命令行中的-Wl,前缀轻松指定(如果尚未作为普通gcc选项提供)。

答案 1 :(得分:3)

这主要是品味问题:当命令行比使用ld更简单时,您可以直接使用gcc。那就是当您只是使用链接器来操作少量共享对象时,例如,创建一个具有很少依赖性的共享库。

由于您可以通过ld选项将选项传递给-Wl,因此人们通常会建议您只使用gcc来管理命令行。