他们的位置是硬编码为gcc代码还是gcc只是调用 as
我们必须拥有 as
我们的PATH变量中的位置?
在后一种情况下,我们如何创建两个完全独立的gcc工具链?我的意思是,我们怎么做 gcc-A
调用 as-A
和 gcc-B
调用 as-B
如果 as-A
和 as-B
都叫 as
?
他们的位置是硬编码为gcc代码还是gcc只是调用 as
我们必须拥有 as
我们的PATH变量中的位置?
在后一种情况下,我们如何创建两个完全独立的gcc工具链?我的意思是,我们怎么做 gcc-A
调用 as-A
和 gcc-B
调用 as-B
如果 as-A
和 as-B
都叫 as
?
一些路径(例如,到 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
将向您展示一些编译路径(作为配置行的一部分)。
一些路径(例如,到 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
将向您展示一些编译路径(作为配置行的一部分)。
您还可以使用以下命令查询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
有一个特别的选项:-B *前缀*,引用gcc文档:
对于要运行的每个子程序,编译器驱动程序首先尝试-B前缀(如果有)。如果 找不到该名称,或者如果未指定-B,则驱动程序会尝试两个标准前缀, 这是/ usr / lib / gcc /和/ usr / local / lib / gcc /。 [...]