Беда компиляции современного 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 заставляет мой код работать в 1/2 раза быстрее, чем компилятор GCC 4.4.7, который поставляется с Centos.
Любые предложения о том, как это сделать?
3 ответа
Создайте компилятор 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 и явно использовать ее при запуске программного обеспечения.
Мне нужно было сделать это только на 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 правильно собирался.
Вы можете установить более новый glibc в ~/lib
и установите GCC в ~/bin
и связывание с новым glibc. Я бы посоветовал использовать это только для вашего приложения, которое работает на суперкомпьютере, и статически связывать все (включая libc), чтобы избежать большего беспорядка, чем вы должны будете сделать для этого.
Это не очень аккуратное / элегантное решение, но оно может просто сделать работу. Я делал нечто подобное несколько лет назад, когда копался в ld.so и не хотел портить всю систему:-)