Как gcc находит исполняемые файлы as, ld и других binutils? - PullRequest
13 голосов
/ 09 октября 2011

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

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

Ответы [ 3 ]

10 голосов
/ 09 октября 2011

Некоторые пути (например, к 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, длиной в несколько страниц.

Running gcc -v покажет вам некоторые скомпилированные пути (как часть строки конфигурации).

3 голосов

Как мы могли бы создать два совершенно отдельных набора инструментов gcc?

Компилировать GCC из исходного кода дважды, подробные инструкции по адресу: Несколько библиотек glibc на одном хосте

Насколько я вижу, все жестко запрограммировано и тесно связано, я не думаю, что есть какое-либо другое достойное решение.

Запрос пути поиска 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 голосов
/ 23 февраля 2013

Для этого есть специальная опция: -B * prefix *, в кавычках gcc docs:

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

...