Как заставить GCC использовать ld.gold, если в пути поиска компилятора существует исполняемый файл real-ld? - PullRequest
0 голосов
/ 06 февраля 2019

Я обнаружил, что когда GCC (пробовал на GCC 4.8 и GCC 6.4) находит real-ld исполняемый файл в своем пути поиска, он молча игнорирует параметр -fuse-ld=... и использует real-ld вместо соответствующего компоновщика.

$ echo "int main(){}" > script.c
$ ln -s /usr/bin/ld real-ld
$ gcc -fuse-ld=gold -B$PWD script.c
$ readelf --string-dump=.note.gnu.gold-version a.out
readelf: a.out: Warning: Section '.note.gnu.gold-version' was not dumped because it does not exist!

Обычно, без real-ld он будет работать как положено:

$ echo "int main(){}" > script.c
$ gcc -fuse-ld=gold script.c
$ readelf --string-dump=.note.gnu.gold-version a.out

String dump of section '.note.gnu.gold-version':
  [     c]  GNU
  [    10]  gold 1.12

Документация GCC предполагает использование компоновщика gold.

Документация о collect2 ничего не говорит о -fuse-ld функции ...

1 Ответ

0 голосов
/ 07 февраля 2019

tl; dr Это невозможно [2].Это особенность.

Я углубился в исходный код GCC , его историю и документацию collect2 , и пришел к выводучто на основе этих документов ожидается, что real-ld будет иметь приоритет над всеми другими двоичными файлами [1].

Однако логика поиска real ld, когда -fuse-ld=...включено, расплывчато и не отражено в документации ...

Исходя из исходного кода, насколько я понимаю язык C, функция -fuse-ld=... эффективна только тогда, когда collect2 пытается найти ld.

[1] Единственное исключение - когда GCC компилируется с --with-ld=..., но только для не кросс-компиляторов.Это ничего не дает, если нельзя перестроить GCC (или использовать кросс-компилятор).

[2] Не совсем верно.Просто пришла хакерская идея создать собственный real-ld, который будет исполнять ld.gold, и изменить путь поиска компилятора (используя -B вместо -fuse-ld=...):

$ cat /path/to/real-ld/real-ld
#!/bin/sh
exec ld.gold "$@"

$ gcc -B /path/to/real-ld/ ...
...