Назад | Перейти на главную страницу

Проблемы с компиляцией современного GCC с античным glibc

Я пытаюсь скомпилировать современный GCC на Centos 6.4. Проблема в том, что Centos не имеет современного glibc, а GCC 4.8.x и 4.7.x продолжают выдавать мне следующую ошибку компиляции:

... -DL_gcov -c ../../.././libgcc/libgcov.c
In file included from /usr/include/features.h:385:0,
                 from /usr/include/stdio.h:28,
                 from ../../.././libgcc/../gcc/tsystem.h:88,
                 from ../../.././libgcc/libgcov.c:29:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory

Проблема здесь в gnu/stubs-32.h является частью современного glibc а в Centos 6.4 его, похоже, нет. Я пробовал построить свой собственный glibc но как только он будет установлен и в моем локальном LD_LIBRARY_PATH Я не могу запускать никакие другие программы, потому что все существующие исполняемые файлы в системе пытаются связать их с ней, и они терпят неудачу.

Я хочу использовать новый компилятор, потому что он значительно лучше обрабатывает код C ++ STL, а также потому, что оптимизатор в GCC 4.8 заставляет мой код выполняться вдвое быстрее, чем компилятор GCC 4.4.7, который поставляется с Centos.

Есть предложения, как это сделать?

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

Мне нужно было сделать это только на CentOS 5, так что вы можете обойтись более высокими версиями программного обеспечения, чем я упоминаю.

Вам нужно будет собрать GLIBC следующим образом:

CFLAGS='-march=i686 -O2' ../configure --prefix=/home/glibc215 \
  make -j 4 && make install

(Я использовал GLIBC 2.15, аналогичные команды должны работать с более новыми версиями)

После его создания запустите приложение вручную примерно так:

/home/glibc215/lib/ld-linux.so.2 --library-path /home/glibc215/lib/:. /bin/bash

Все будет еще больше усложняться тем фактом, что вам нужна современная версия GCC. У меня нет подходящего решения для вас, вам нужно будет поиграться с запуском других версий glibc, чтобы ваш новый gcc собрался правильно.

Соберите компилятор gcc на вашем Centos и настройте его только на 64 бита.
Отрывок из документация:

Стандартная библиотека C и заголовки Для сборки GCC стандартная библиотека C и заголовки должны присутствовать для всех целевых вариантов, для которых будут построены целевые библиотеки (а не только для варианта компилятора C ++ хоста). Это влияет на популярную платформу «x86_64-unknown-linux-gnu» (среди других мультибиблиотечных целей), для которой 64-битные («x86_64») и 32-битные («i386») заголовки libc обычно упаковываются отдельно. Если вы выполняете сборку собственного компилятора на x86_64-unknown-linux-gnu, убедитесь, что у вас правильно установлен 32-разрядный пакет разработчика libc (точное имя пакета зависит от вашего дистрибутива), либо вы должны собрать GCC как 64-разрядный компилятор, настроенный с параметром --disable-Multilib. В противном случае вы можете столкнуться с такой ошибкой, как «фатальная ошибка: gnu / stubs-32.h: нет такого файла».

Вы можете установить более новую версию glibc в ~/lib и установите gcc в ~/bin и связывание с более новым glibc. Я бы посоветовал использовать это только для вашего приложения, которое работает на суперкомпьютере, и связать все (включая libc) статически, чтобы избежать большего беспорядка, чем вам придется для этого сделать.

Это не особенно изящное / элегантное решение, но оно может просто выполнять свою работу. Я сделал нечто подобное много лет назад, когда возился с ld.so и не хотел портить всю систему :-)