gcc如何找到,ld和其他binutils可执行文件?

时间:2011-10-09 03:12:52

标签: gcc binutils

他们的位置是否已硬编码为gcc代码或gcc是否只需调用as,我们的PATH变量中必须有as个位置?

在后一种情况下,我们怎样才能创建两个完全独立的gcc工具链?我的意思是,如果gcc-Aas-A都被称为gcc-B,我们如何让as-B调用as-Aas-B调用as

3 个答案:

答案 0 :(得分:10)

编译了一些路径(例如,cc1)。其他路径(例如as)在$ PATH中使用普通查找。这取决于GCC配置的选项。

您可以通过straceexec|stat点击来轻松判断。

$ strace -f gcc foo.c -o foo |& grep exec
⋮
[pid 24943] execve("/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.6.1/cc1", …

这是通过编译路径调用cc1,如您所见 缺乏寻找它。它也不在$ PATH。

[pid 24944] execve("/home/anthony/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
[pid 24944] execve("/usr/local/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = -1 ENOENT (No such file or directory)
[pid 24944] execve("/usr/bin/as", ["as", "--64", "-o", "/tmp/ccCIrcGi.o", "/tmp/ccbw3PkL.s"], [/* 51 vars */]) = 0

那是在$ PATH中寻找as。你可以说,因为它尝试了每个 按顺序在$ PATH中的位置。

我省略了很多strace输出 - 即使只有stat和exec,它 几页长。

运行gcc -v将显示一些已编译的路径(作为配置行的一部分)。

答案 1 :(得分:3)

我们如何创建两个完全独立的gcc工具链?

从源代码编译GCC两次,详细说明请参阅:Multiple glibc libraries on a single host

就我所见,一切都是硬编码和高度耦合的,我不认为还有其他合适的解决方案。

查询GCC搜索路径

您还可以使用以下方式查询GCC搜索路径:

gcc -print-search-dirs | grep -E '^programs' | tr ':' '\n'

示例输出:

programs
 =/usr/lib/gcc/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/
/usr/lib/gcc/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/6/
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/
/usr/lib/gcc/x86_64-linux-gnu/6/../../../../x86_64-linux-gnu/bin/

和具体的程序:

gcc -print-prog-name=cc1

示例输出:

/usr/lib/gcc/x86_64-linux-gnu/6/cc1

答案 2 :(得分:2)

有一个特别的选项:-B *前缀*,引用gcc docs:

  

对于要运行的每个子程序,编译器驱动程序首先尝试-B前缀(如果有)。如果   找不到该名称,或者如果未指定-B,则驱动程序会尝试两个标准前缀,   这是/ usr / lib / gcc /和/ usr / local / lib / gcc /。 [...]