g cc компилирует файл ELF с неправильным списком поиска - PullRequest
0 голосов
/ 16 июня 2020

После компиляции g cc и использования его для компиляции простой c программы:

echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
grep -B4 '^ /usr/include' dummy.log

результат:

ignoring nonexistent directory "/tools/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../x86_64-pc-linux-gnu/include"
ignoring duplicate directory "/tools/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include

но согласно Linux Из руководства 9.1 с нуля в разделе 6.25 «Убедитесь, что компилятор ищет правильные файлы заголовков:» ожидается следующее (игнорируя *linux -gnu пути ...):

#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed
 /usr/include

Что еще хуже, так это то, что

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

это:

SEARCH_DIR("/usr/lib");

но должно быть:

SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

Я пытался добавить все пути в /etc/ld.so.conf и перекомпилировал g cc pass 2, но ничего не изменилось.

Итак, что именно определяет записи SEARCH_DIR в файле ELF?

EDIT1: Я отступил и обнаружил, что предыдущий шаг make -k clean не завершился sh, потому что отсутствует автоген, который, кажется, вообще не рассматривается в руководстве LFS 9.1.

1 Ответ

1 голос
/ 19 июня 2020

Я перезапустил LFS 9.1 и следовал инструкциям с большей осторожностью, теперь результат такой, как ожидалось!

Есть две вещи, которые я сделал по-другому:

Для каждого пакета:

  1. Использование tar, распакуйте собираемый пакет. В главе 5 убедитесь, что вы являетесь пользователем lfs при извлечении пакета.

  2. Перейдите в каталог, созданный при извлечении пакета.

  3. Следуйте инструкциям в книге по созданию пакета.

  4. Вернуться в каталог с исходными кодами.

  5. Удалить извлеченный исходный каталог, если не указано иное в противном случае.

Когда я переустанавливал хост-ОС, я не создавал ее с lfs в качестве первого пользователя. Вместо этого я создал его с помощью пользователя lfshost и создал пользователя lfs , как описано в разделе 4.3
...