Сборка GCC с помощью glibc в нестандартном месте без рута

У меня есть система, к которой у меня нет 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


person Austin Wagner    schedule 01.12.2012    source источник
comment
Передать -L$ROOT/lib вместо этого или дополнительно?   -  person lynxlynxlynx    schedule 01.12.2012
comment
Я делаю это. ../gcc-4.7.2/configure [snip] LDFLAGS="-L$ROOT/lib -L$ROOT/lib64"   -  person Austin Wagner    schedule 01.12.2012
comment
Вы ссылаетесь на свою собственную libc, но не указываете полученному исполняемому файлу, где найти libc во время выполнения. -L этого не делает, вам нужно -rpath=$ROOT в LDFLAGS в дополнение к -L.   -  person n. 1.8e9-where's-my-share m.    schedule 01.12.2012
comment
Если вы получаете сообщение о недопустимости ELF-файла OS ABI, попробуйте собрать ld-linux.so и поместить его в тот же каталог, в котором находится ваш libc. Я не уверен, что это сработает. См. также здесь.   -  person n. 1.8e9-where's-my-share m.    schedule 04.12.2012
comment
@н.м. К сожалению, это не работает. Приложения используют загрузчик, с которым они были созданы, для загрузки своих зависимостей. Я нашел очень простое объяснение правильного порядка сборки (devpit.org/wiki/Gnu_Toolchain), но у меня действительно нет времени бросать случайные переключатели и взламывать все подряд, пока это не заработает.   -  person Austin Wagner    schedule 05.12.2012


Ответы (1)


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

Новый glibc и старый glibc несовместимы не только с ABI, но и с заголовками, см. ошибка gcc 52922. .

Поэтому любое смешивание приведет к ошибкам, с которыми вы столкнулись, вам нужно быть предельно осторожным.

Ручная настройка безнадежно утомительна.

Если вы хотите использовать gcc-4.7.2, я рекомендую вам Gentoo Prefix. У меня есть много экземпляров Gentoo Prefix, работающих на RHEL 5 (с ядром 2.6.18, gcc-4.1 и glibc-2.5, как и у вас). Это компилирует gcc-4.7.2 поверх glibc-2.5.

Если вы хотите получить удовольствие от использования более новой glibc, взгляните на Prefix/libc. Тем не менее, это незавершенная работа. Ожидайте много поломок. Но это не будет большим недостатком, если вы пытаетесь скомпилировать современную цепочку инструментов вручную, не так ли?

person heroxbd    schedule 01.07.2013
comment
Спасибо, что сообщили мне о проекте Gentoo Prefix! Это, вероятно, будет моим спасением в этой старой системе, которую я использую :) - person SamGamgee; 11.07.2013