Как может я создавать более старый gcc (а именно, 4.5.2) на Ubuntu 11.10 и избегать ошибок о "/usr/bin/ld: не может найти crti.o: Никакой такой файл или каталог"?
Я сделал немного рытья и нашел несколько подобных объектов, но ни один, что на самом деле решает мой вопрос:
При выполнении с strace (согласно этому ответу), я вижу пустую ссылку на crti.o:
13 240 открытых ("crti.o", O_RDONLY) =-1 ENOENT (Никакой такой файл или каталог)
Спасибо!
У меня была такая же проблема. Создание символических ссылок из /usr/libs/crt?.o
в /usr/lib/x86_64-linux-gnu/crt?.o
решило проблему для меня.
Я решил эту проблему с помощью нескольких обходных путей, которые могут быть полезны для вас.
Сначала соберите GCC с LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
, чтобы процесс начальной загрузки сборки знал, где найти стартовые файлы crt?.o
.
Затем, вместо создания crt?.o
символических ссылок в /usr/lib
, где они влияют на всю вашу систему, вы можете использовать символические ссылки этих трех файлов в каталог ${prefix}/lib/gcc/...
, соответствующий каталогу ${prefix}/bin
, в котором установлен исполняемый файл gcc
. in. На самом деле это почти наверху пути поиска стартовых файлов, поэтому он найдет их - но они больше ни на что не влияют.
В моем случае конкретный каталог для их размещения был lib/gcc/x86_64-unknown-linux-gnu/4.3.2/
; Вы можете найти правильный, потому что в нем уже есть другие файлы, такие как crtbegin.o
.
Даже очень новые версии GCC терпят неудачу с этим сообщением. Это связано с тем, что новые выпуски Debian / Ubuntu поддерживают (будут) поддержку multiarch (т.е. устанавливают двоичные файлы для нескольких машин в одной файловой системе), поэтому библиотеки были удалены из стандартных мест.
Есть исправления GCC, чтобы исправить это здесь (еще не утвержденные окончательные версии, но правильные для Ubuntu), и они, вероятно, применимы к старому GCC без особых усилий, возможно. Я думаю, вам нужно настроить GCC с - enable-multiarch или чем-то подобным.
В то же время, создание программных ссылок является хорошим исправлением:
cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .
(имя папки будет отличаться в 32-разрядных установках).
Надеюсь, что это помогает.
Я собрал 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 с ним.