linux编译链在哪,交叉编译工具链的gcc使用哪一个ld?

交叉编译工具链有两个目录里面包含了ld,那么会使用哪一个呢?

shuyin.wsy@localhost:/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20$ ls arm-linux-gnueabi/bin

ar as ld ld.bfd ld.gold nm objcopy objdump ranlib strip

shuyin.wsy@localhost:/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20$ ls bin

arm-linux-gnueabi-addr2line arm-linux-gnueabi-g++ arm-linux-gnueabi-gprof arm-linux-gnueabi-readelf

arm-linux-gnueabi-ar arm-linux-gnueabi-gcc arm-linux-gnueabi-ld arm-linux-gnueabi-run

arm-linux-gnueabi-as arm-linux-gnueabi-gcc-4.9.2 arm-linux-gnueabi-ld.bfd arm-linux-gnueabi-size

arm-linux-gnueabi-c++ arm-linux-gnueabi-gcc-ar arm-linux-gnueabi-ld.gold arm-linux-gnueabi-strings

arm-linux-gnueabi-c++filt arm-linux-gnueabi-gcc-nm arm-linux-gnueabi-nm arm-linux-gnueabi-strip

arm-linux-gnueabi-cpp arm-linux-gnueabi-gcc-ranlib arm-linux-gnueabi-objcopy

arm-linux-gnueabi-dwp arm-linux-gnueabi-gcov arm-linux-gnueabi-objdump

arm-linux-gnueabi-elfedit arm-linux-gnueabi-gdb arm-linux-gnueabi-ranlib

使用gcc -print-prog-name=ld命令可以查看到gcc使用的ld是哪一个:

shuyin.wsy@localhost:/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin$ ./arm-linux-gnueabi-gcc -print-prog-name=ld

/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin/../lib/gcc/arm-linux-gnueabi/4.9.2/../../../../arm-linux-gnueabi/bin/ld

发现使用的是arm-linux-gnueabi/bin/ld,而不是bin/arm-linux-gnueabi-ld

将arm-linux-gnueabi-gcc拷贝到其他目录,然后再看看:

shuyin.wsy@localhost:/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin$ cp arm-linux-gnueabi-gcc ~/

shuyin.wsy@localhost:/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin$ ~/arm-linux-gnueabi-gcc -print-prog-name=ld

ld说明gcc是使用了一个相对目录去寻找ld的。

那么这个所谓的相对目录怎么看呢,使用echo | gcc -v -x c -E -:

COMPILER_PATH=/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin/../libexec/gcc/arm-linux-gnueabi/4.9.2/:/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin/../libexec/gcc/:/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin/../lib/gcc/arm-linux-gnueabi/4.9.2/../../../../arm-linux-gnueabi/bin/

gcc.c里面会设置exec_prefixes这个变量,往里面添加一些目录,添加的最后一个目录是:

4070 add_prefix (&exec_prefixes,

4071 concat (tooldir_prefix, "bin", dir_separator_str, NULL),

4072 "BINUTILS", PREFIX_PRIORITY_LAST, 0, 0);也就是刚才找ld用到的那个目录/disk7/shuyin.wsy/dev_host/prebuilts/gcc/linux-x86/arm/arm-linux-gnueabi-4.9-glibc-2.20/bin/../lib/gcc/arm-linux-gnueabi/4.9.2/../../../../arm-linux-gnueabi/bin

gcc在调用collect之前,还会把exec_prefixes放到环境变量里面:

7156 /* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables

7157 for collect. */

7158 putenv_from_prefixes (&exec_prefixes, "COMPILER_PATH", false);gcc调用collect,collect会从gcc设置的COMPILER_PATH环境变量里面找ld,也就是上面说的那个

具体exec_prefixes加了哪些路径,如何加,还需要细看源代码。

这里有篇说gcc如何调用cc1预处理和编译,as汇编,collect调用ld连接的:

http://daimajishu.iteye.com/blog/1087393

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值