Как установить конкретную версию GCC в Kali Linux?

8

Этот вопрос, кажется, правильно решен в нескольких вопросах и в других местах, которые легко найти в Google, но я не нахожу решение удовлетворительным по причинам, изложенным ниже. Но просто для завершения я включил несколько соответствующих ссылок:

/ubuntu/138284/how-to-downgrade-a-package-via-apt-get /ubuntu/428772/how-to-install-specific-version-of -some-package / 428778 /ubuntu/26498/choose-gcc-and-g-version ...

И другие.

Тем не менее, этот вопрос касается установки очень специфической версии GCC в Kali Linux, которая недоступна в виде специального пакета. В частности, вопрос касается того, как установить версию 6.3.0, поскольку мне нужна эта версия для компиляции конкретной программы: https://www.reddit.com/r/Monero/comments/6d0ah8/xmrig_miner_new_release/.

(В качестве дополнительного вопроса, если есть более разумный способ решить эту конкретную проблему без использования другой версии GCC, не стесняйтесь отвечать, но я считаю, что этот вопрос является общим, и я хотел бы знать, как это сделать, независимо от того, как правильно сделать ссылку на вышеупомянутую программу)

Версии, доступные для установки любого пакета, например, gcc, могут быть определены с помощью:

apt-cache showpkg gcc

Который будет перечислять доступные версии в «версии:», например,

4:7.2.0-1d1
4:4.9.2-2

Установка тогда так же просто, как выдача

apt-get install gcc:4:4.9.2-2

Это установит старую версию 4: 4.9.2-2, просто (я полагаю) перезаписав установку 7.2.0-1d1, если она есть.

Чтобы получить версию 4: 4.9.2-2, я должен был добавить ее deb http://old.kali.org/kali sana main non-free contribв свой /etc/apt/sources.listфайл и запустить apt-get update.

Однако, что если нужной мне версии нет в списке?

Я экспериментировал с различными источниками, например, найденными здесь: http://snapshot.debian.org/, а также с различными другими вопросами и веб-сайтами из поисковых запросов Google.

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

Ign:3 http://snapshot.debian.org/archive/debian/20091004T111800Z lenny InRelease

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

Если я ищу gcc на snapshot.debian.org, я получаю только очень старые версии: http://snapshot.debian.org/package/gcc/

В конечном итоге я разочаровался в этом подходе и скомпилировал GCC 6.3.0 из исходного архива. Компиляция прошла успешно, но потом я столкнулся с тем, как ее установить. Я осторожно работает , make installкак я боюсь , что это будет искажать aptи dpkgи , возможно , сломать систему.

Вместо этого я попытался запустить его непосредственно из каталога сборки. Я попытался просто добавить каталог сборки в качестве первой записи в моем PATH, но это не сработало. Затем я попытался переименовать /usr/bin/gccи создать символическую ссылку, /usr/bin/gccоткуда живет мой исполняемый файл gcc-6.3.0. Это представляет следующую проблему:

cc: error trying to exec 'cc1': execvp: No such file or directory, which

Это было исправлено с другой записью в моем ПУТИ.

Затем я получаю эту ошибку:

/usr/include/stdio.h:34:21: fatal error: stddef.h: No such file or directory

Я полагаю, это из-за отсутствия записи в /usr/lib/gcc/x86_64-linux-gnu. Я пытался сделать символическую ссылку с 6 до 6.3.0, но этого было недостаточно. Я также пытался скопировать все с cp -Rтем же результатом.

Это должна быть 64-битная программа, но я также рассмотрел то же самое для /usr/lib/gcc/i686-linux-gnu.

Я уверен, что смогу начать с того, straceчтобы увидеть, откуда он пытается открыть файлы, прочитать файлы журналов, прочитать исходный код, и в конце концов я представляю, что смогу выяснить, как взломать плохо продуманное решение. Но было бы неплохо, если бы кто-нибудь сказал мне, как это сделать в здравом уме.

Альфа Центавра
источник
Это не умаляет общих достоинств вашего вопроса; но в настоящее время выбросы из XMRig должны построить штраф с GCC 7, так что вы просто должны быть в состоянии построить его без возни с GCC 6.3.
Стивен Китт
Вы всегда можете скомпилировать GCC (любую не слишком древнюю версию) из его исходного кода , так как это бесплатное программное обеспечение. Будьте осторожны при настройке и создавайте его вне исходного дерева.
Старынкевич

Ответы:

10

Как установить конкретную версию GCC в Kali Linux?

GCC 6 доступен на Linux, его можно установить следующим образом:

apt install g++-6 gcc-6

Для переключения между gcc6 и gcc7

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1 --slave /usr/bin/g++ g++ /usr/bin/g++-7
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 2 --slave /usr/bin/g++ g++ /usr/bin/g++-6
update-alternatives --config gcc

образец вывода:

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-6   2         auto mode
  1            /usr/bin/gcc-6   2         manual mode
  2            /usr/bin/gcc-7   1         manual mode

Press <enter> to keep the current choice[*], or type selection number:

Выберите gccверсию по умолчанию .

2017-08-05 версия gcc-6 обновлена ​​с 6.3.0до 6.4.0.

Установка xmrigследуя инструкциям сборки .

apt-get install git build-essential cmake libuv1-dev libmicrohttpd-dev
git clone https://github.com/xmrig/xmrig.git
cd xmrig
mkdir build
cd build
cmake ..
make

Сборка конкретной версии gcc 6.3.0

Загрузите архив с ближайшего зеркала : GCC Releases

wget https://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
tar xvf gcc-6.3.0.tar.gz
cd gcc-6.3.0
apt build-dep gcc
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-6.3.0/configure --prefix=/usr/bin/gcc-6.3 --enable-languages=c,c++,fortran,go --disable-multilib
make -j 8
make install

Добавить gcc-6.3вupdate-alternatives

Важный : --disable-multilibопция требуется, чтобы настроить и построить gccдля текущей архитектуры.

GCC WIKI: Установка GCC

GAD3R
источник
1
Простите, но разве это не устанавливает какую-либо версию GCC, которую предоставляет "gcc-6"? Что если я хочу установить конкретно 6.3.0?
AlphaCentauri
@AlphaCentauri 6 месяцев назад доступна версия gcc6 6.3.0, теперь версия gcc6 обновлена ​​до 6.4.0.
GAD3R
1
Обновлен ответ @AlphaCentauri, включая этапы строительства.
GAD3R
1
  1. Сначала вы должны перейти на этот сайт: http://gcc.gnu.org/mirrors.html
  2. Затем выберите старые выпуски, и вы увидите разные версии.
  3. Теперь вы должны нажать на тот, который вы хотите иметь, и загрузка начнется.

  4. Наконец, вы должны скомпилировать и установить из исходного кода: /ubuntu/25961/how-do-i-install-a-tar-gz-or-tar-bz2-file

Прашант Лухар
источник
1
Спасибо, но я не верю, что вы прочитали весь мой вопрос. Я указал, как я пытался скомпилировать из источника. Проблема с этим (как указано в моем вопросе) заключается в том, что выполнение «make install» в GCC может быть не очень хорошей идеей, поскольку может привести к поломке системы. Кроме того, простой запуск GCC без выполнения make install создает свои собственные проблемы, которые я также изложил в своем первоначальном вопросе.
AlphaCentauri
Вы указали в своем вопросе, что make installможет повлиять dpkgили apt... можете уточнить! @AlphaCentauri
Прашант Лухар
0

Если вы выполнили стандарт ./configure; makeбез передачи каких-либо параметров configure, то make installпоместите фрагменты желаемой версии GCC в различные подкаталоги /usr/local.

/usr/localДерево каталогов предназначена для программного обеспечения , установленного системным администратором внешней системы управления пакетами (то есть. Именно то , что вы делаете). Таким образом, установленное там программное обеспечение не нарушит упакованное программное обеспечение, за исключением крайне необычных обстоятельств.

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

отметка
источник
Вы не должны (и, вероятно, не преуспеете) строить GCC в его исходном дереве. И вы , вероятно , хотите , дополнительные опции для своего configureсценария (например , некоторые и -program-suffix=т.д.)
Basile Starynkevitch
0

В конечном итоге я разочаровался в этом подходе и скомпилировал GCC 6.3.0 из исходного архива. Компиляция прошла успешно,

Во-первых, я бы порекомендовал, если вы компилируете GCC из его источника, выбрать более свежую версию (например, GCC 7 в конце 2017 года).

Затем обязательно соберите GCC вне его исходного дерева и попробуйте сначала его configureсценарий --helpи передайте ему больше параметровconfigure . Прочитайте внимательно к установке GCC инструкции и понять роль Autoconf .

На практике я рекомендую

  • запустить, /usr/bin/gcc -vчтобы понять, как был настроен GCC вашей системы

  • запустить apt-get build-dep gcc-6(или аналогичный), чтобы получить последние системные зависимости GCC

  • создайте каталог сборки вне вашего исходного кода GCC и запустите его дальше .../configure(замените ...его соответствующим относительным путем, например ../gcc-7.2/) и makeтам.

  • вы, вероятно, захотите перейти хотя бы --program-suffix=-mineк этому configure( -mineможно заменить другим суффиксом), и вы можете даже добавить, --prefix=$HOME/soft/если у вас нет доступа с правами root. Вы , вероятно , хотите дополнительные опции к , configureи вы должны выбрать и дать им тщательно.

  • затем более поздняя версия make install(вы даже можете запустить ее без прав root, make install DESTDIR=/tmp/gccinst/а затем аккуратно и рекурсивно копировать ее как root, которая /tmp/gccinst/....) установит все в /usr/local/bin/gcc-mineetc .... (или $HOME/soft/bin/gcc-mine....), поэтому не будет нарушать установленные системные файлы ,

Обратите внимание, что FHS требует, чтобы система управления пакетами оставалась одна /usr/local/(по умолчанию --prefixдля GCC configure)

Василий Старынкевич
источник
У ОП уже есть GCC 7, но он искал 6.3.0 после ошибочного комментария Reddit.
Стивен Китт
0

Вы также можете использовать предварительно скомпилированный набор инструментов или этот для вашей конкретной архитектуры (x86_64, glibc, gcc 6.3).

Конечно, следующий вариант - использовать так называемый rootfs-builder, такой как buildroot или yocto,
для генерации цепочки инструментов с вашей конкретной версией gcc.

Кристиан Стенцель
источник