Соберите старый glibc с помощью Guix

Скажите, что у вас есть программа ac, но подойдет почти любая программа, и поместите ее в файл:

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

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

И скажите, что по какой-то причине вы хотите собрать его для определенной версии glibc. Моя первоначальная попытка сделать это состояла в том, чтобы создать среду Guix, содержащую эту старую версию вместе с (и coreutilsдля таких программ, как ls).

      $ 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

К сожалению, это не работает. Полученная программа связана с более новой версией, чем я ожидал, 2.31, а не 2.29. Но это может быть связано с тем, что он связан с 2.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)

Куда мне идти отсюда? Я пытался использовать более старые версии, упакованные в Guix, но все они, похоже, построены против glibc2.31. Я также пытался добавить -L /gnu/store/hlsas48h6x7364kcfs8yy6xfksdsffr4-glibc-2.29/libк моему gcc-вызов, но безрезультатно.

1 ответ

Я смог разобраться, а точнее: cbaines на # [email protected] указал мне на функцию 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и вставьте его в свою оболочку rc и заполните его следующим содержимым:

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

Таким образом, каждый раз, когда вы входите в эту папку со своей оболочкой, для вас будет загружаться среда разработки. Правильная версия glibc/gcc будет работать даже без --pureфлаг.

Другие вопросы по тегам