Как Вы создаете более старые gcc версии? Ошибки о crti.o, не находимом

Как может я создавать более старый 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 работает, но хотел бы избежать этого (это становится отличающейся точкой в make-файлах),
  • Я попробовал различные вещи - with-build-sysroot, но без успеха (чтение: возможно, я просто не знаю, что правильный флаг устанавливает),
  • При выполнении с strace (согласно этому ответу), я вижу пустую ссылку на crti.o:

    13 240 открытых ("crti.o", O_RDONLY) =-1 ENOENT (Никакой такой файл или каталог)

Спасибо!

9
задан 23 May 2017 в 15:39

4 ответа

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

0
ответ дан 23 May 2017 в 15:39

Я решил эту проблему с помощью нескольких обходных путей, которые могут быть полезны для вас.

Сначала соберите 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.

0
ответ дан 23 May 2017 в 15:39

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

Есть исправления GCC, чтобы исправить это здесь (еще не утвержденные окончательные версии, но правильные для Ubuntu), и они, вероятно, применимы к старому GCC без особых усилий, возможно. Я думаю, вам нужно настроить GCC с - enable-multiarch или чем-то подобным.

В то же время, создание программных ссылок является хорошим исправлением:

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

(имя папки будет отличаться в 32-разрядных установках).

Надеюсь, что это помогает.

0
ответ дан 23 May 2017 в 15:39

Я собрал 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 с ним.

0
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: