3

假设您有 ac 程序,但几乎任何程序都可以,并将其放入文件中:

#include <stdio.h>
#include <gnu/libc-version.h>

int main (void) {
    puts (gnu_get_libc_version ());
    return 0;
}

并说您出于某种原因想要针对特定​​版本的 glibc 构建它。我最初的尝试是创建一个包含旧版本的 Guix 环境(以及glibc类似的程序)。gcccoreutilsls

$ guix environment --pure --ad-hoc glibc@2.29 gcc-toolchain coreutils
$ rm a.out && gcc printer.c && ldd a.out && a.out
    linux-vdso.so.1 (0x00007ffd2cd0c000)
    libgcc_s.so.1 => /gnu/store/jlrfl1ss3b4xjggvajwffa9zppfcxksf-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fcefd7b6000)
    libc.so.6 => /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/libc.so.6 (0x00007fcefd5f9000)
    /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/ld-linux-x86-64.so.2 (0x00007fcefd7d1000)
2.31

不幸的是,这似乎不起作用。生成的程序链接到glibc比我预期的更新版本 2.31 而不是 2.29。但这可能是由于gcc它本身与glibc2.31 相关联,最终污染了环境,可以这么说。

$ ldd $(which gcc)
    linux-vdso.so.1 (0x00007fff7cfc5000)
    libm.so.6 => /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/libm.so.6 (0x00007ff842b93000)
    libc.so.6 => /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/libc.so.6 (0x00007ff8429d6000)
    /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/ld-linux-x86-64.so.2 (0x00007ff842cd6000)

我从这里去哪里?我尝试过使用gccGuix 中打包的旧版本,但它们似乎都是针对glibc2.31 构建的。我也尝试添加-L /gnu/store/hlsas48h6x7364kcfs8yy6xfksdsffr4-glibc-2.29/lib到我的gcc-invocation 但无济于事。

4

1 回答 1

2

我能够弄清楚,或者更确切地说:#guix@freenode 上的 cbaines 将我指向make-gcc-toolchain允许我设置我想要的环境的功能。通过将以下代码放入名为 的文件中development-environment.scm

(use-modules (gnu packages base)
             (gnu packages commencement)
             (gnu packages gcc)
             (gnu packages version-control))

(define-public gcc-glibc-2.29-toolchain
  (make-gcc-toolchain gcc glibc-2.29))

(list gcc-glibc-2.29-toolchain git coreutils)

然后运行guix environment --pure --ad-hoc --load=development-environment.scm我能够使用我想要的 glibc 版本构建我的程序:

$ rm a.out && gcc printer.c && ldd a.out && ./a.out
    linux-vdso.so.1 (0x00007fff7e17c000)
    libgcc_s.so.1 => /gnu/store/71rcc4qxfgyzr0qphkh9adjsqsb999zk-gcc-glibc-2.29-7.5.0-lib/lib/libgcc_s.so.1 (0x00007f2c8adc9000)
    libc.so.6 => /gnu/store/hlsas48h6x7364kcfs8yy6xfksdsffr4-glibc-2.29/lib/libc.so.6 (0x00007f2c8ac0f000)
    /gnu/store/hlsas48h6x7364kcfs8yy6xfksdsffr4-glibc-2.29/lib/ld-linux-x86-64.so.2 (0x00007f2c8ade4000)
2.29

后人的热点提示:将以下内容放入名为 的文件中.envrc,安装包direnv并将其插入到您的 shell rc 中,并在其中填充以下内容:

use guix --ad-hoc --load=development-environment.scm

这样,每次您使用 shell 进入该文件夹时,都会为您加载开发环境。--pure即使没有标志,正确版本的 glibc/gcc 也会运行。

于 2021-02-05T15:41:26.507 回答