Наконец-то нормальный способ (кросс-)компиляции под старые glibc
Делюсь находкой: в языке программирования zig есть встроенный кросс-компилятор C и C++ под разные архитектуры, а также возможность указания версии символов glibc (от 2.16: Debian 8+, Ubuntu 13.10+, CentOS 7, Fedora 18+).
zig cc
/ zig c++
обечпечивает режим совместимости с вызовом cc
и cpp
.
Иными словами, этими командами можно безболезненно:
- Кросс-компилировать (и архитектуры, и ОС, т.е. под Windows и macOS из Linux) без заморочек с
sysroot
’ами - Собирать современный код (C23, C++23) под дистрибутивы последних 10 лет выпуска
Ранее для этого либо собирали кросс-компилятор со старым glibc, либо использовали различные костыли по замене хедеров glibc (bingcc, glibc_version_header), либо патчили, либо собирали на старых ОС вроде CentOS 7 (благо там можно установить свежие компиляторы).
Теперь же можно:
$ gcc -o hello_gcc hello.c
$ nm -D hello_gcc
w __gmon_start__
U __libc_start_main@GLIBC_2.34 ←←← минимум glibc 2.34
U puts@GLIBC_2.2.5
$ zig cc -o hello_zig hello.c
$ nm -D hello_zig
w __gmon_start__
U __libc_start_main@GLIBC_2.34 ←←← минимум glibc 2.34
U puts@GLIBC_2.2.5
$ zig cc -target x86_64-linux-gnu.2.16 -o hello_zig hello.c
$ nm -D hello_zig
U __libc_start_main@GLIBC_2.2.5 ←←← минимум glibc 2.2.5
U puts@GLIBC_2.2.5
# И даже под Windows @ ARM64
$ zig cc -target aarch64-windows -o hello_zig hello.c
$ file hello_zig
hello_zig: PE32+ executable for MS Windows 6.00 (console), ARM64, 7 sections
# Или вообще с musl libc
$ zig cc -target aarch64-linux-musl -o hello_zig hello.c
$ file hello_zig
hello_zig: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, with debug_info, not stripped