Рецепт для компиляции binutils и gcc вместе? - PullRequest
22 голосов
/ 13 ноября 2009

В соответствии с инструкциями gcc вы можете собирать binutils одновременно со сборкой gcc (а также gmp, mpc и т. Д.).

Вот что говорит эта страница:

Если вы также собираетесь собирать binutils (либо обновить существующий установка или для использования вместо соответствующие инструменты вашей ОС), распаковать дистрибутив binutils либо в том же каталоге или отдельный В последнем случае добавьте символические ссылки на любые компоненты binutils, которые вы собираетесь построить рядом с компилятором (bfd, binutils, газ, gprof, ld, коды операций, ...) к каталог, содержащий источники GCC.

Аналогично GMP, MPFR и MPC библиотеки могут быть автоматически созданы вместе с GCC. Распакуйте GMP, MPFR и / или MPC исходные дистрибутивы в каталоге, содержащем GCC источники и переименовать их каталоги в gmp, mpfr и mpc соответственно (или использовать символические ссылки с тем же имя).

Это прекрасно работает для gmp, mpc, mpfr, но я не могу заставить его собрать все binutils. Также я не могу понять, как заставить его создать новый компоновщик золота из binutils. Этими версиями являются gcc-4.4.2 и binutils-2.20.

Было бы замечательно пошаговая инструкция (для меня и для других, кто также сталкивается с этой проблемой).

Ответы [ 3 ]

26 голосов
/ 03 июня 2011

Это все еще должно поддерживаться в порядке, так как это обычно используется для построения кросс-компиляторов.

На самом деле, я только что сделал это с gcc 4.6.0 и binutils 2.21 (с gmp, mpc и mpfr в соответствующих версиях), и, похоже, следующее работает нормально:

  • Получите все архивы того, что вы собираетесь собрать (gcc-4.6.0.tar.bz2, binutils-2.21.tar.bz2 и т. Д.), В новый каталог, например. src
  • Распакуйте их все в этом каталоге, так что в итоге вы получите gcc-4.6.0/ binutils-2.21/ gmp-5.0.2/ и больше, сидящих рядом друг с другом

    tar jxvf gcc-4.6.0.tar.bz2
    ... (unpack others here, watch file lists scroll past)
    
  • cd gcc-4.6.0 и символические ссылки на каталоги gmp, mpc и mpfr без номеров версий в ссылках, например:

    ln -s ../gmp-5.0.2 gmp
    
  • Теперь символическая ссылка на все из binutils dir, который не существует в gcc dir, поэтому все, что уже существует, будет иметь приоритет, но инструменты binutils будут выглядеть видимыми для сборки:

    for file in ../binutils-2.21/* ; do ln -s "${file}" ; done
    
  • Измените каталог и создайте каталог для сборки, чтобы построить все это отдельно от источников (это всегда был рекомендуемый метод, и он все еще более надежен, чем сборка внутри исходного каталога):

    cd .. ; mkdir build
    
  • На данный момент у вас должен быть набор каталогов и ссылок, который выглядит примерно так:

    binutils-2.21/
    build/
    gcc-4.6.0/
       gmp -> ../gmp-5.0.2
       mpc -> ../mpc-0.9
       mpfr -> ../mpfr-3.0.1
       bfd -> ../binutils-2.21/bfd
       binutils -> ../binutils-2.21/binutils
       gas -> ../binutils-2.21/gas
       ... (lots more symlinks for binutils here, plus existing gcc stuff)
    gmp-5.0.2/
    mpc-0.9/
    mpfr-3.0.1/
    
  • Сконфигурируйте всю партию из этого каталога с любыми опциями, которые вам нужно передать для настройки:

    ../gcc-4.6.0/configure --prefix=/foo/bar --enable-languages=c,c++,ada
    
  • Сборка, ожидание, установка (вы, вероятно, захотите использовать make -j4 или около того, чтобы получить несколько сборок параллельно, поскольку это займет некоторое время):

    make -j4 ; make install
    

Добавьте место назначения к вашему пути, если его еще нет (и, возможно, каталог lib к LD_LIBRARY_PATH, если он находится за пределами указанных в /etc/ld.so.conf, как указано в сообщениях об установке библиотек на этапе make install), и все должно быть в порядке с этой новой версией.

Вероятно, стоит проверить, используете ли вы эту установленную версию после того, как открыли новую оболочку, с:

    `which gcc`

и

    `which as`

.. а также то, что версия соответствует ожидаемой:

    `gcc --version`

и

    `as --version`

.. а также (конечно же) тестирование того, что установленная версия хорошо собирает исполняемые файлы, с несколькими простыми примерами, прежде чем выпустить ее на базу кода:)

Редактировать: комментарии ниже содержат некоторые наборы версий, которые, как известно, работают вместе. Не все комбинации будут работать, поэтому вам, возможно, придется пройти через метод проб и ошибок для комбинаций, отличных от упомянутых!

Гораздо позже редактировать: GDB также можно включить в эту сборку (опять же требуется совместимые версии компонентов - см. Комментарии). Аналогичным образом добавьте это как последнюю вещь после binutils, используя for f in ../gdb-8.1.1/* ; do ln -s "${f}" ; done, и сборка автоматически поднимет его.

4 голосов
/ 10 марта 2010

То, что вы хотите сделать, называется сборкой "комбинированного дерева" или "in-tree binutils". Вы можете найти документацию о том, как действовать здесь и там .

0 голосов
/ 13 ноября 2009

Я всегда строю все отдельно. После того, как вы собрали и установили binutils, gcc должен работать нормально, если вы предоставляете каждому скрипту configure одинаковые опции --target и --prefix:

Binutils:

$ ./configure --target=XYZ --prefix=/abc/def
$ make all install

затем добавьте путь (при необходимости):

$ export PATH="$PATH:/abc/def/bin"

и сборка gcc:

$ ./configure --target=XYZ --prefix=/abc/def
$ make all-gcc install-gcc

Затем соберите свой libc и остальную часть gcc, если необходимо (возможно, и отладчик!).

...