Як ви створюєте старіші версії gcc? Помилок щодо crti.o не знайдено


10

Як я можу створити старіший gcc (конкретно, 4.5.2) на Ubuntu 11.10 та уникнути помилок щодо "/ usr / bin / ld: не вдається знайти crti.o: Немає такого файлу чи каталогу"?

Я трохи копав і знайшов кілька подібних предметів, але жоден, який насправді не вирішує мою проблему:

  • Я перевірив, що всі мої пакети (libc6-dev тощо) перевстановлені за цим питанням
  • Я перевірив, що crti.o існує в / usr / lib32 та / usr / lib / x86_64-linux-gnu, і що мій ld.so.conf налаштований на пошук у цих каталогах
  • Я перевірив, що, передчуваючи виклик зробити LIBRARY_PATH = / usr / lib / x86_64-linux-gnu, працює, але хотів би цього уникнути (це стає різною точкою у makefiles)
  • Я пробував різні речі з --with-build-sysroot, але без успіху (читайте: можливо я просто не знаю правильний прапор для встановлення)
  • Під час бігу з напругою (відповідно до цієї відповіді ) я бачу голі посилання на crti.o:

    13240 open ("crti.o", O_RDONLY) = -1 ENOENT (немає такого файлу чи каталогу)

Дякую!

Відповіді:


7

У мене була така ж проблема. Створення символічних посилань від /usr/libs/crt?.o до /usr/lib/x86_64-linux-gnu/crt?.oвирішена проблема для мене.


Це працює, так. Я сподівався на рішення, яке скоріше налаштовуватиме встановлення gcc, а не обробляти основні файлові структури ...
Matt

Я хотів додати, що в моєму випадку я перекомпілював glibc та GCC, але забув позбутися старого варіанту slackware-gcc, який був у / usr / bin /. Коли я видалив останнє, я міг би знову скомпілювати певні речі (наприклад, gcc).
шеві

10

Навіть дуже нові версії GCC провалюються з цим повідомленням. Це тому, що новий Debian / Ubuntu випускає (буде) підтримувати мультиарх (тобто встановлення бінарних файлів для декількох машин в одній файловій системі), тому бібліотеки були віддалені від стандартних місць.

Є GCC патчі виправити тут (ще не затверджені остаточні варіанти, але вірно для Ubuntu), і вони , ймовірно , належать до старшого ПКУ без особливих зусиль, може бути. Я думаю, вам потрібно налаштувати GCC за допомогою --enable-multiarch , або щось таке.

Тим часом, створення м'яких посилань є гарним виправленням:

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(назва папки буде відрізнятися в 32-бітних установках).

Сподіваюся, що це допомагає.


Дякуємо за те, що він багатоцільовий. Я сподівався, що резолюція щодо "чому" перестала працювати.
Метт

2

Я вирішив цю проблему за допомогою декількох способів вирішення, які можуть бути корисні для вас.

Спочатку побудуйте GCC за допомогою LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, щоб процес збирання завантажувального crt?.oфайлу знав, де знайти стартові файли.

Тоді, замість того, щоб робити crt?.oпосилання на те, /usr/libде вони впливають на всю вашу систему, ви можете позначити ці три файли до ${prefix}/lib/gcc/...каталогу, відповідного ${prefix}/binкаталогу, в який встановлений gccвиконуваний файл. Це насправді майже вгорі його шляху пошуку для початкових файлів, так що вони знайдуть їх, але вони не впливають ні на що інше.

У моєму випадку конкретний каталог для їх розміщення був lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; ви можете знайти потрібний, оскільки в ньому вже є інші файли, як crtbegin.oу ньому.


1

Я створив GCC 4.1.2 на Ubuntu точний x86_64. Як ви це зробили, я переглянув штрих останньої команди "xgcc", шукаючи 32-бітну тривалість виконання, grep-ped / 32 / наступним чином. Тривалість роботи в шахті знаходиться в / usr / lib32, що надається пакетом libc6-dev-i386.

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

Отже, я створив crt? .O символьні посилання в каталозі, який шукав xgcc.

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

Я успішно створив з ним GCC 4.1.2.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.