这个问题似乎在几个问题和谷歌很容易找到的其他地方得到了正确的解决,但由于下面解释的原因,我没有找到令人满意的解决方案。但为了完成,我已经包含了一些相关链接:
https://askubuntu.com/questions/138284/how-to-downgrade-a-package-via-apt-get https://askubuntu.com/questions/428772/how-to-install-specific-version-of -some-package/428778 https://askubuntu.com/questions/26498/choose-gcc-and-g-version ...
和别的。
然而,这个问题是关于在 Kali Linux 中安装一个非常特定版本的 GCC,它似乎并不容易作为一个特定的包提供。特别是,问题是关于如何安装版本 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
即使这可行,安装特定版本似乎也是一种非常糟糕的方法,因为添加一些任意源可能没有我想要的特定版本。
如果我在 snapshot.debian.org 上搜索 gcc,我只会得到非常旧的版本:http ://snapshot.debian.org/package/gcc/
我最终对这种方法感到沮丧,并从源代码 tarball 编译了 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
这已通过我的 PATH 中的另一个条目修复。
然后,我收到此错误:
/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
查看它尝试从哪里打开文件、读取日志文件、读取源代码,最终我想我能够弄清楚如何将一个构思不佳的解决方案组合在一起。但是,如果有人能以理智的方式告诉我如何做到这一点,那就太好了。
GCC 6 在 kali linux 上可用,它可以按如下方式安装:
在 gcc6 和 gcc7 之间切换
样本输出:
选择您的默认
gcc
版本。2017-08-05 gcc-6 版本
6.3.0
从6.4.0
.构建特定的 gcc 版本
6.3.0
从最近的镜像下载压缩包: GCC Releases
添加
gcc-6.3
到update-alternatives
重要提示:该选项是为当前架构
--disable-multilib
配置和构建所必需的。gcc
GCC WIKI : 安装 GCC
现在您应该单击您想要的那个,然后下载将开始。
最后,您必须从源代码编译和安装:https ://askubuntu.com/questions/25961/how-do-i-install-a-tar-gz-or-tar-bz2-file
如果您在没有将
./configure; make
任何选项传递给.configure
make install
/usr/local
目录树适用于系统管理员在包管理系统之外安装的
/usr/local
软件(即,正是您正在做的事情)。因此,安装在那里的软件不会破坏打包的软件,除非在极不寻常的情况下。特别是 GCC 是围绕您将安装多个版本的假设而设计的。它几乎需要您采取积极措施来破坏任何东西(例如,通过混合和匹配部分来尝试创建混合版本)。
首先,如果您从源代码编译 GCC,我建议您选择更新的版本(例如2017 年底的GCC 7 )。
然后,确保在其源代码树之外构建 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 身份仔细和递归地复制....)将在etc....(或....)/tmp/gccinst/
中安装东西,因此不会破坏任何系统安装的文件./usr/local/bin/gcc-mine
$HOME/soft/bin/gcc-mine
请注意,FHS要求包管理系统不理会(这是GCC 的
/usr/local/
默认设置)--prefix
configure
您还可 以为您的特定架构(x86_64、glibc、gcc 6.3)使用预编译的工具链或这个 工具链。
当然,下一个选项是使用所谓的 rootfs-builder (如 buildroot 或 yocto)
来生成具有您特定 gcc 版本的工具链。