交叉编译工具链有两个目录里面包含了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