GCC & amp; сборка binutils — компилятор C не может создавать исполняемые файлы

Я пытаюсь собрать gcc-5.3 и binutils-2.26. Я сделал это так:

mkdir gcc; cd gcc
wget http://path/to/gcc-5.3.0.tar.bz2
wget http://path/to/binutils-2.26.tar.bz2
tar xf gcc-5.3.0.tar.bz2
tar xf binutils-2.26.tar.bz2
cd gcc-5.3.0
contrib/download_prerequisites
for file in ../binutils-2.26/*; do ln -s "${file}"; done
cd ..
mkdir build
mkdir dist
cd build
../gcc-5.3.0/configure --prefix=/home/teamcity/gcc/dist --disable-multilib --with-system-zlib --enable-languages=c,c++,fortran --program-suffix=-mine
make

Это похоже на сборку исполняемых файлов первого этапа. prev-gas, prev-gcc, prev-ld все присутствуют с правдоподобно выглядящими исполняемыми файлами в них. Но следующий этап не проходит:

Configuring stage 2 in ./intl
configure: loading cache ./config.cache
checking whether make sets $(MAKE)... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking whether NLS is requested... yes
checking for msgfmt... /usr/bin/msgfmt
checking for gmsgfmt... /usr/bin/msgfmt
checking for xgettext... /usr/bin/xgettext
checking for msgmerge... /usr/bin/msgmerge
checking for x86_64-unknown-linux-gnu-gcc...  /home/teamcity/gcc/build/./prev-gcc/xgcc -B/home/teamcity/gcc/build/./prev-gcc/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/lib/ -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/include -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/sys-include -L/home/teamcity/gcc/build/./ld
checking for C compiler default output file name...
configure: error: in `/home/teamcity/gcc/build/intl':
configure: error: C compiler cannot create executables
See `config.log' for more details.

Соответствующий бит config.log выглядит так:

configure:2978: checking for C compiler default output file name
configure:3000:  /home/teamcity/gcc/build/./prev-gcc/xgcc -B/home/teamcity/gcc/build/./prev-gcc/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unkn
own-linux-gnu/bin/ -B/home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/lib/ -isystem /home/teamcity/gcc/dist/x86_64-unknown-linux-gnu/include -isystem /home/teamcity/gcc/dist/x86_64-unknown-l
inux-gnu/sys-include -L/home/teamcity/gcc/build/./ld    -g -O2 -gtoggle  -static-libstdc++ -static-libgcc  conftest.c  >&5
/home/teamcity/gcc/build/./prev-gcc/as: 106: exec: /home/teamcity/gcc/build/./gas/as-new: not found

Это выглядит как предыдущие GCC, как и ожидал найти gas/as-newкогда на самом деле это prev-gas/as-new,

Есть ли какое-то решение для этого? Это безопасно просто ln -s prev-gas gas? Я бы ожидал, что это вызовет проблемы позже. Разве нельзя собрать эти две версии gcc и binutils вместе?

1

Решение

Это мой отредактированный ответ после того, как я попробовал его на виртуальной машине Ubuntu 14.04 Azure.

У меня сработал следующий подход:

  • Сборка и установка binutils 2.26; для целей этого обсуждения,
    допустим, он установлен в /opt/gcc-5.3.0.
  • Сконфигурируйте gcc-5.3.0 в каталоге сборки, используя /root/objdir/../gcc-5.3.0/configure --prefix=/opt/gcc-5.3.0
    --enable-languages=c,c++ --disable-multilib --with-ld=/opt/gcc-5.3.0/bin/ld --with-as=/opt/gcc-5.3.0/bin/as
    предполагая, что gcc-5.3.0 и каталог сборки, objdir, в то же
    уровень.
  • Делать make с последующим make install в objdir построить каталог.

Чтобы убедиться, что ld используется недавно построенный gcc это один из новых binutils:

/opt/gcc-5.3.0/bin/gcc -print-prog-name=ld

Вывод должен быть, в этом примере:

/opt/gcc-5.3.0/bin/ld

Еще один тест: переименуйте систему ld, в моем случае /usr/bin/ld; недавно построенный gcc должен все еще работать.

Конечно, это относится как к ld а также as,

Установка переменных среды AS и LD для указания на вновь созданные двоичные файлы из пакета binutils не работали: -print-prog-name=... все еще показывал инструменты по умолчанию, а удаление / переименование инструментов по умолчанию вызывало сбой gcc.

Таким образом, лучший способ сделать это — сначала собрать binutils, а затем использовать --with-ld а также --with-as варианты configure, Если вы также хотите убедиться, что недавно созданные binutils используются для сборки GCC, вы можете поместить их в переменную PATH до системных инструментов или даже переименовать системные инструменты, чтобы они не попадали в картина.

Спасибо за проверку с помощью другого списка рассылки, чтобы убедиться, что сборка GCC и binutils вместе не работает, если они не извлечены из системы контроля версий, я думаю, что эта опция неприменима при использовании загруженных tar-архивов. В целом это было интересное упражнение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]