У меня есть система, к которой у меня нет root-доступа, но мне нужно установить текущую версию GCC (4.7.2).
В системе работает сборка x86_64 Linux 2.6.18 и уже установлен GCC 4.1 (без поддержки C++, хотя --version говорит, что он был собран с ним).
РЕДАКТИРОВАТЬ 5: На данный момент приведенные ниже шаги — это всего лишь один набор вещей, которые я пробовал. С тех пор я начал чистить несколько раз. Я ищу кого-нибудь, чтобы подробно описать точный порядок, в котором мне нужно сделать все со всеми необходимыми переключателями.
Это процесс, через который я прошел до сих пор (где ROOT — это папка в моем домашнем каталоге)
make-3.82>./configure --prefix=$ROOT && make && make install && hash -r
binutils-2.23>./configure --prefix=$ROOT && make && make install
autoconf-2.69>./configure --prefix=$ROOT && make && make install
automake-1.9>./configure --prefix=$ROOT && make && make install
flex-2.5.37>./configure --prefix=$ROOT && make && make install
libunwind-1.1>./configure --prefix=$ROOT && make && make install
gcc-4.7.2-scratch>../gcc-4.7.2/configure --prefix=$ROOT \
--disable-multilib --disable-nls --enable-languages=c,c++ \
&& make && make install && hash -r
ncurses-5.9>./configure --prefix=$ROOT && make && make install
texinfo-4.13>./configure --prefix=$ROOT && make && make install
glibc-2.14-scratch>touch $ROOT/etc/ld.so.conf
Исправлен glibc с помощью патча с http://sourceforge.net/apps/trac/unattended/wiki/ModifyingTheBootDisk#PatchGLibc (исправление номеров строк для версии 2.14)
glibc-2.14-scratch>../glibc-2.14/configure --prefix=$ROOT \
--with-headers=$3undefined reference to '__isoc99_sscanf'
4_HEADERS && make && make install
Я добавил флаги, чтобы избавиться от undefined reference to '__isoc99_sscanf'
. Я не знаю, какая комбинация флагов на самом деле была необходима, чтобы это исправить, но она устранила проблему с этими флагами.
gcc-4.7.2-scratch2>../gcc-4.7.2/configure --prefix=$ROOT \
--disable-multilib --disable-nls --enable-languages=c,c++ \
CPPFLAGS="-I$ROOT/include" CFLAGS="-g -O2 -lc" \
CXXFLAGS="-g -O2 -lc" LDFLAGS="-L$ROOT/lib \
-L$ROOT/lib64" && make && make install
Теперь я получаю эту ошибку во время сборки GCC:
build/genmddeps ../../gcc-4.7.2/gcc/config/i386/i386.md > tmp-mddeps
build/genmddeps: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by build/genmddeps)
Ошибка имеет смысл, потому что libc в /lib64 имеет версию 2.5, но я не знаю, как заставить GCC использовать тот, который я собрал и установил в $ROOT/lib.
РЕДАКТИРОВАТЬ 1: добавление -rpath не помогло, но я добавил свои каталоги lib в LD_RUN_PATH и LD_LIBRARY_PATH. С этим набором я ничего не мог запустить, потому что получал ошибку [program_name]: error while loading shared libraries: /home/mrambiguous/root/lib/libc.so.6: ELF file OS ABI invalid
Еще одна странная вещь, которую следует отметить, это то, что когда я попробовал предложение -rpath, я начал получать ошибки от GCC о нераспознанных параметрах командной строки (таких как -V). Мне пришлось настроить его на использование системного GCC 4.1. Теперь я не уверен, была ли моя первая сборка GCC каким-то образом повреждена или она вообще когда-либо использовалась.
РЕДАКТИРОВАТЬ 2: я только что открыл libc.so.6 в vim, чтобы посмотреть, смогу ли я найти что-нибудь об ABI в виде простого текста, и там есть информация об авторских правах. libc ABIs: UNIQUE IFUNC
Это также подтверждает, что GCC 4.7.2 работал в том же блоке текста. Compiled by GNU CC version 4.7.2
РЕДАКТИРОВАТЬ 3: Удален $ ROOT, переустановил все, та же проблема с нераспознаванием -V и -qversion как допустимых параметров.
РЕДАКТИРОВАТЬ 4: я попытался отредактировать заголовок ELF с помощью brandelf -t SVR4 libc.so.6
, но это просто дает мне новую ошибку unexpected PLT reloc type 0x25
../gcc-4.7.2/configure [snip] LDFLAGS="-L$ROOT/lib -L$ROOT/lib64"
- person Austin Wagner   schedule 01.12.2012libc
во время выполнения.-L
этого не делает, вам нужно-rpath=$ROOT
вLDFLAGS
в дополнение к-L
. - person n. 1.8e9-where's-my-share m.   schedule 01.12.2012ld-linux.so
и поместить его в тот же каталог, в котором находится вашlibc
. Я не уверен, что это сработает. См. также здесь. - person n. 1.8e9-where's-my-share m.   schedule 04.12.2012