他们的位置是否已硬编码为gcc代码或gcc是否只需调用as
,我们的PATH变量中必须有as
个位置?
在后一种情况下,我们怎样才能创建两个完全独立的gcc工具链?我的意思是,如果gcc-A
和as-A
都被称为gcc-B
,我们如何让as-B
调用as-A
和as-B
调用as
?
答案 0 :(得分:10)
编译了一些路径(例如,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
那是在$ 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 /。 [...]