LINUX.ORG.RU

Сборка полностью автономных утилит

 ,


0

3

Проекту необходимы полностью автономные исполняемые 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

★★

Последнее исправление: zzdnx (всего исправлений: 10)
Ответ на: комментарий от anonymous

вскрывается привязка к серсии libc

Собирай с самой старой версией, какая может оказаться на целевых системах.

Libc может отсутствовать в целевой системе, так что нужно встраивать непосредственно в исполняемый файл.

P.S. добавил в шапку неочевиную информацию о возможном отсуствии libc.

zzdnx ★★
() автор топика
Последнее исправление: zzdnx (всего исправлений: 2)

Нашёл команду, которая приводит к сбою:

gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wshadow=compatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -static -O2 -pthread -D_REENTRANT -D_THREAD_SAFE -fPIC -shared -Wl,-soname,libpq.so.5 -Wl,--version-script=exports.list -o libpq.so.5.17  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 -L../../../src/port -L../../../src/common -lpgcommon_shlib -lpgport_shlib -static  -Wl,--as-needed -Wl,-rpath,'/usr/lib',--enable-new-dtags  -lssl -lcrypto -lm

GCC собирает «static», но потом появляется «-shared -Wl,-soname,libpq.so.5 -Wl,--version-script=exports.list -o libpq.so.5.17».

После завершения configure пробовал найти файл, в котором появляется shared, но безуспешно. Что делать?

zzdnx ★★
() автор топика
Ответ на: комментарий от EXL

Вызов «pkg-config --libs pg» возвращает «Package 'pg' not found».

А вот вызов «pkg-config --libs libpq» возвращает «-lpq». Скорее всего, так и должно быть.

Файл «/usr/lib/libpq.a» поставлен пакетом libpq-dev.

Файл заголовков («libpq.h») отсутствует - это может быть причиной моей проблемы?

zzdnx ★★
() автор топика

Добавил пакет postgresql17-dev, который поставляет libpq.h, однако, это не помогло, ошибка та же: сборщик пытается собрать статический объект с динамической версией библиотеки libpq.so:

make[2]: Leaving directory '/app/postgresql-17.6/src/common'
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wimplicit-fallthrough=3 -Wcast-function-type -Wshadow=compatible-local -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -static -O2 -pthread -D_REENTRANT -D_THREAD_SAFE -fPIC -shared -Wl,-soname,libpq.so.5 -Wl,--version-script=exports.list -o libpq.so.5.17  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 -L../../../src/port -L../../../src/common -lpgcommon_shlib -lpgport_shlib -static  -Wl,--as-needed -Wl,-rpath,'/usr/lib',--enable-new-dtags  -lssl -lcrypto -lm  
rm -f libpq.a
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
touch libpq.a
/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
collect2: error: ld returned 1 exit status
make[1]: *** [../../../src/Makefile.shlib:261: libpq.so.5.17] Error 1
make[1]: Leaving directory '/app/postgresql-17.6/src/interfaces/libpq'
make: *** [../../../src/Makefile.global:626: submake-libpq] Error 2
make: *** Waiting for unfinished jobs....
rm -f libpgcommon_srv.a

Что за шиза?

zzdnx ★★
() автор топика
Ответ на: комментарий от irton

Так а зачем у тебя повторно libpq собирается, если уже установлена в системе

Если верить информации с pkgs.alpinelinux.org, то пакет «postgresql17-dev» поставляет заголовки «libpq.h» именно для серверной части СУБД, то есть, клиенту она вообще может быть не нужна, а даже если нужна - у меня установлена статитческая версия «libpq.a». Сборка статической и полностью автономной утилиты psql не предусмотрена разработчиками?

отключи ее сборку (патчить надо и опцию для configure, если мне память не изменяет)

Можно подробнее?

zzdnx ★★
() автор топика
Последнее исправление: zzdnx (всего исправлений: 2)

postgres без сторонних патчей не собирает статический psql.

Автолулзы - говно. Собери мезоном, открой build.ninja и найди там строку, которая начинается с build src/bin/psql/psql:. Замени там все *.so на *.a, плюс добавь src/common/libpgcommon_shlib.a. После чего

$ ninja src/bin/psql/psql

Работоспособность не обещаю))

Lrrr ★★★★★
()
Ответ на: комментарий от lovesan

Вот поэтому терпеть не могу сраную сишечку и аналоги.

Стандартные анальные боли лишпо-клованофф :)

У нас в лиспе все просто: save-lisp-and-die

Но «save» зафэйлился, а «die» - сработал. Ну нету вашего лишпа, вообще нигде нет, жаже где раньшен - был … вы всё прос**ли :-\

RiP\ПсМ

anonymous
()