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


他们的位置是硬编码为gcc代码还是gcc只是调用 as 我们必须拥有 as 我们的PATH变量中的位置?

在后一种情况下,我们如何创建两个完全独立的gcc工具链?我的意思是,我们怎么做 gcc-A 调用 as-A 和 gcc-B 调用 as-B 如果 as-A 和 as-B 都叫 as


10246
2017-10-09 03:12


起源



答案:


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

你可以通过运行来相当容易地说出来 strace,并为 exec|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

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

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

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


10
2017-10-09 04:50



非常感谢你。您知道哪些配置选项定义了最终行为吗?有没有办法限制gcc只使用/ my / path / as和my / path / ld? - Michalis Vichos
@MichalisVichos:可能是配置标志 --with-as=/my/path/as 会这样做的。出现配置文档可在以下位置获得 gcc.gnu.org/install/configure.html (当然还有 ./configure --help) - derobert


答案:


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

你可以通过运行来相当容易地说出来 strace,并为 exec|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

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

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

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


10
2017-10-09 04:50



非常感谢你。您知道哪些配置选项定义了最终行为吗?有没有办法限制gcc只使用/ my / path / as和my / path / ld? - Michalis Vichos
@MichalisVichos:可能是配置标志 --with-as=/my/path/as 会这样做的。出现配置文档可在以下位置获得 gcc.gnu.org/install/configure.html (当然还有 ./configure --help) - derobert


您还可以使用以下命令查询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
2018-05-16 18:20





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

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


1
2018-02-22 21:22