Как вы строите старые версии GCC? Ошибок по поводу crti.o не обнаружено

10

Как я могу собрать более старый gcc (в частности, 4.5.2) в Ubuntu 11.10 и избежать ошибок, связанных с "/ usr / bin / ld: not find crti.o: Нет такого файла или каталога"?

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

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

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

Спасибо!

Matt
источник

Ответы:

7

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

Yoav
источник
Это работает, да. Я надеялся на решение, которое было бы больше похоже на настройку установки gcc, а не на связывание с базовыми файловыми структурами, хотя ...
Matt
Я хотел добавить, что в моем случае я перекомпилировал glibc и GCC, но я забыл избавиться от более старого варианта slackware-gcc, который был в / usr / bin /. Когда я удалил последний, я мог снова скомпилировать некоторые вещи (например, снова gcc).
Шев
10

Даже очень новые версии GCC терпят неудачу с этим сообщением. Это связано с тем, что новые выпуски Debian / Ubuntu поддерживают (будут) поддержку multiarch (т.е. устанавливают двоичные файлы для нескольких машин в одной файловой системе), поэтому библиотеки были удалены из стандартных мест.

Есть 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 Precision x86_64. Как и вы, я взглянул на последнюю команду «xgcc», ища 32-битную среду выполнения c, grep-ped / 32 /, следующим образом. Моя среда выполнения C находится в / 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 с ним.

Наоюки Тай
источник