我添加了工具链测试构建 ppa到我的 Xenial 系统,这样我就可以使用 GCC 7 进行开发。在某个时候,它还将 GCC 5 更新到5.4.1-2ubuntu1~16.04
PPA 中可用的最新版本。但是,此版本的 GCC 5 没有针对 Spectre/Meltdown 的最新补丁。所以上次我进行内核更新(其中曾是由于使用这些补丁进行编译),我的 DKMS 模块在没有补丁的情况下重新编译,版本魔法不匹配,它们拒绝加载,破坏了各种东西。
我想删除工具链 GCC 5(和相关软件包)并将其替换为原版 GCC 5(版本5.4.0-6ubuntu1~16.04.9
,具有 retpoline 补丁),但理想情况下,我希望在不触发卸载所有 DKMS 模块和其他依赖于 GCC 5 的东西的情况下执行此操作。我还想保留 GCC-7 的工具链测试 PPA。最简单的方法是什么?
答案1
我最终做了什么:
获取从与 GCC-5 关联的工具链 PPA 安装的软件包列表:
aptitude -F "%p" search "?origin(ubuntu-toolchain-r) ?version(5.4.1) ?installed"
对于每个版本,请手动下载正确的版本:
aptitude download cpp-5=5.4.0-6ubuntu1~16.04.9 ...
安装所有下载的.debs:
sudo dpkg -i *.deb
apt check
(现在是确保您没有破坏任何东西的好时机。)/etc/apt/preferences.d/
通过创建包含以下内容的文件来固定这些软件包,这样 PPA 版本就永远不会被使用:Package: gcc-5 cpp-5 g++-5 gcc-5-base gcc-5-base:i386 gcc-5-doc libasan2 libgcc-5-dev libgcj16 libmpx0 libobjc-5-dev libstdc++-5-dev Pin: release o=LP-PPA-ubuntu-toolchain-r-test Pin-Priority: -1
运行
apt-cache policy gcc-5
并检查以确保旧版本是首选。重建所有 DKMS 模块:
dkms status # list DKMS modules sudo dkms remove modulename/version -k $(uname -r) sudo dkms build modulename/version -k $(uname -r) sudo dkms install modulename/version -k $(uname -r)
仔细检查
modinfo
新编译模块的 vermagic 是否包含“retpoline”。reboot
,并希望一切正常。