Проекту необходимы полностью автономные исполняемые psql и htpasswd.
Собрать с ключом -static проблем нет и ldd сообщает что целевые файлы собраны статически.
Однако, при переносе утилит в другую ОС вскрывается привязка к серсии libc, которая может отсутствовать в целевой ОС.
Поиск привёл меня к сборщику полносью автономной и смодостаточной версии sqlite3: https://github.com/CompuRoot/static-sqlite3
ОС Alpine Linux (v3.22) в контейнере Docker, которая сама скачивает и собирает исходный код, доставляет результат сборки в хост-ОС и уходит в утиль.
Осталось переделать это под необходимые мне утилиты.
Начал с psql.
Программное окруение (Alpine Linux v3.22):
apk update
apk upgrade
apk del libressl-dev # решает конфликт с openssl
apk add –no-cache \
fakeroot \
binutils \
upx \
file \
wget \
unzip \
libhistory \
build-base \
linux-headers \
bison flex flex-dev musl-utils musl-dev perl \
libpq-dev postgresql-dev \
zlib-dev zlib-static \
openssl-dev openssl-libs-static \
icu-dev icu-static icu-data-full \
readline-dev readline-static \
ncurses-dev ncurses-static
Сборка:
wget "https://ftp.postgresql.org/pub/source/v17.6/postgresql-17.6.tar.gz"
tar -xzvf postgresql-*.tar.gz
cd postgresql-*
export LDFLAGS="-static"
export CFLAGS="-static -O2"
./configure --prefix=/usr --with-zlib --with-openssl # опции --enable-static и --disable-shared не определены.
make -C "src/bin/psql" -j4 # мне нужна только psql
Сценарий configure выполняется без ошибок, но make падает:
ar crs libpq.a fe-auth-scram.o fe-cancel.o fe-connect.o fe-exec.o fe-lobj.o fe-misc.o fe-print.o fe-protocol3.o fe-secure.o fe-trace.o legacy-pqsignal.o libpq-events.o pqexpbuffer.o fe-auth.o fe-secure-common.o fe-secure-openssl.o
/usr/lib/gcc/x86_64-alpine-linux-musl/14.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: /usr/lib/gcc/x86_64-alpine-linux-musl/14.2.0/crtbeginT.o: relocation R_X86_64_32 against hidden symbol `__TMC_END__' can not be used when making a shared object
/usr/lib/gcc/x86_64-alpine-linux-musl/14.2.0/../../../../x86_64-alpine-linux-musl/bin/ld: failed to set dynamic section sizes: bad value
Похоже, make собирает статическую версию библиотеки libpq.a, которая поставляется в уже установленном пакете libpq-dev.
Судя по протоколу make выше, другие библиотеки (например: readline, ssl, zlib) успешно подхватываются. Что я делаю не так?
P.S.: Почему make собирает «shared object» при явном указании «static»?
Перемещено hobbit из general