用库存 GCC5 替换工具链测试 GCC5 的最简单方法是什么?

用库存 GCC5 替换工具链测试 GCC5 的最简单方法是什么?

我添加了工具链测试构建 ppa到我的 Xenial 系统,这样我就可以使用 GCC 7 进行开发。在某个时候,它还将 GCC 5 更新到5.4.1-2ubuntu1~16.04PPA 中可用的最新版本。但是,此版本的 GCC 5 没有针对 Spectre/Meltdown 的最新补丁。所以上次我进行内核更新(其中曾是由于使用这些补丁进行编译),我的 DKMS 模块在没有补丁的情况下重新编译,版本魔法不匹配,它们拒绝加载,破坏了各种东西。

我想删除工具链 GCC 5(和相关软件包)并将其替换为原版 GCC 5(版本5.4.0-6ubuntu1~16.04.9,具有 retpoline 补丁),但理想情况下,我希望在不触发卸载所有 DKMS 模块和其他依赖于 GCC 5 的东西的情况下执行此操作。我还想保留 GCC-7 的工具链测试 PPA。最简单的方法是什么?

答案1

我最终做了什么:

  1. 获取从与 GCC-5 关联的工具链 PPA 安装的软件包列表:

    aptitude -F "%p" search "?origin(ubuntu-toolchain-r) ?version(5.4.1) ?installed"
    
  2. 对于每个版本,请手动下载正确的版本:

    aptitude download cpp-5=5.4.0-6ubuntu1~16.04.9
    ...
    
  3. 安装所有下载的.debs:

    sudo dpkg -i *.deb
    

    apt check(现在是确保您没有破坏任何东西的好时机。)

  4. /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并检查以确保旧版本是首选。

  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”。

  6. reboot,并希望一切正常。

相关内容