Соберите старый 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, но все они, похоже, построены против
glibc
2.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
флаг.