Подтвердить что ты не робот

Как gcc находит как, ld и другие исполняемые файлы binutils?

Является ли их местоположение жестко закодированным в gcc-коде или gcc просто вызывает as, и мы должны иметь as местоположение в нашей переменной PATH?

И в последнем случае, как мы могли бы создать два полностью отдельных gcc-инструментальных цепочки? Я имею в виду, как мы можем сделать gcc-A invoke as-A и gcc-B invoke as-B, если as-A и as-B оба вызываются as?

4b9b3361

Ответ 1

Некоторые из путей (например, до cc1) скомпилированы. Другие (например, as) используют обычный поиск в $PATH. Это может варьироваться в зависимости от параметров, на которые настроен GCC.

Вы можете сказать довольно легко, выполнив strace и grepping для 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 покажет вам некоторые из скомпилированных путей (как часть строки конфигурации).

Ответ 2

Для этого существует специальная опция: -B * prefix *, цитирующая gcc docs:

Для каждой подпрограммы, которая должна быть запущена, драйвер компилятора сначала пытается использовать префикс -B, если таковой имеется. Если это имя не найдено или если -B не указано, драйвер пытается использовать два стандартных префикса, которые являются/usr/lib/gcc/и/usr/local/lib/gcc/. [...]

Ответ 3

Вы также можете запросить путь поиска 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