LINUX.ORG.RU

Статическая линковка


0

0

Хочу статически собрать программу использующую sqlite3, gloox, curl. Компилю ее динамически: g++ my2.cpp -lcurl -lgloox -lsqlite3, все отлично, но при линковке статически выдает кучу ошибок. ldd на скомпиленый файл дает большой список либ:
ldd ./a.out
linux-vdso.so.1 => (0x00007fffc53db000)
libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x000000334f200000)
libgloox.so.8 => /usr/lib64/libgloox.so.8 (0x00007f389eeb0000)
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x000000334d000000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003342c00000)
libm.so.6 => /lib64/libm.so.6 (0x000000333a000000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000333ac00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003339400000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003339800000)
libidn.so.11 => /lib64/libidn.so.11 (0x000000334fa00000)
liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x000000334e000000)
libldap-2.4.so.2 => /usr/lib64/libldap-2.4.so.2 (0x000000334e400000)
librt.so.1 => /lib64/librt.so.1 (0x000000333a800000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x0000003346800000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x0000003345400000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x0000003347000000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000003344c00000)
libz.so.1 => /lib64/libz.so.1 (0x000000333a400000)
libssl3.so => /usr/lib64/libssl3.so (0x0000003349c00000)
libsmime3.so => /usr/lib64/libsmime3.so (0x000000334a000000)
libnss3.so => /usr/lib64/libnss3.so (0x0000003349800000)
libnssutil3.so => /usr/lib64/libnssutil3.so (0x0000003348800000)
libplds4.so => /lib64/libplds4.so (0x0000003348c00000)
libplc4.so => /lib64/libplc4.so (0x0000003349400000)
libnspr4.so => /lib64/libnspr4.so (0x0000003349000000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003339c00000)
libssh2.so.1 => /usr/lib64/libssh2.so.1 (0x000000334f600000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x000000333b800000)
libgnutls.so.26 => /usr/lib64/libgnutls.so.26 (0x00000030c1200000)
/lib64/ld-linux-x86-64.so.2 (0x0000003339000000)
libsasl2.so.2 => /usr/lib64/libsasl2.so.2 (0x000000334c000000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x0000003346000000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000003345800000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x0000003348400000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x0000003346c00000)
libtasn1.so.3 => /usr/lib64/libtasn1.so.3 (0x00000030c0e00000)
libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x0000003347c00000)
libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x0000003347400000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000003345000000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x000000333b000000)
libfreebl3.so => /lib64/libfreebl3.so (0x0000003344800000)


и судя по всему эти библтотеки должны быть указаны при линковке и иметь файлы для статической линковки. Пересобирать эти библиотеки у меня нет большого желания, так как могут полезть зависимости.
Отсюда возникает вопрос: Есть ли дистр, который имеет большой набор статических библиотек? или пересборка пакетов единственный путь?

большинство дистрибутивов в -dev или -devel пакетах вместе с заголовками содержать и статические библиотеки, там где это возможно

Sylvia ★★★★★ ()

>g++ my2.cpp -lcurl -lgloox -lsqlite3

как пытаетесь собрать статически?
какие ошибки выдает?

попробуйте такой вариант

g++ my2.cpp /usr/lib64/libcurl.a /usr/lib64/libgloox.a /usr/lib64/libsqlite3.a -o my2program

можно добавить все динамические

-lm -lidn -llber -lldap ... и так далее по вашему списку ldd

Sylvia ★★★★★ ()

еще такой вопрос, вам только sqlite3 и gloox нужны в статику или вам нужен полностью статический бинарник?

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

curl можно пересобрать без этого

если можно попробовать другой дистр (для статической сборки) , то можно взять debian, ubuntu, slackware в слаке сразу есть статические, в debian/ubuntu входят в -dev пакеты

Sylvia ★★★★★ ()

не совсем по статической линковке, но может подойти еще такой вариант
«псевдостатическая» компоновка, с внедрением динамических библиотек,
делается это утилитой
statifier (открытая, бесплатная, но может немного глючить в других системах)

magicErmine (платная, доступен триал на 30 дней (счетчик на каждом скомпонованом бинарнике)) работает практически со всем... но недостатки уже перечислила

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

> еще такой вопрос, вам только sqlite3 и gloox нужны в статику или вам нужен полностью статический бинарник? А если второе, то как?

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

ну и --as-needed вариант не пройдет,
т.е. все нужные библиотеки должны быть перечислены компоновщику, тут только «pass_all» метод

Sylvia ★★★★★ ()

еще, если нахождение нужных библиотек кажется непосильной задачей, вместо ldd
стоит воспользоваться pkg-config PACKAGE --libs
или как вариант - линковать через libtool

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

//offtop.

Я в шоке и надеюсь, что не одному мне кажется, что никакой ты не мед работник. :)

//sry

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

>а в чём проблема?

По навыдумывали. Излишнее разнообразие вариантов ничего кроме страданий не приносит. Завтра придумают какую-нибудь «квазидинамическую статическую псевдокомпоновку». А потом найдется какой-нибудь дурак, который захочет этим воспользоваться.

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

Мужик, ты не прав.

1) Это очень давно придумано, даже не 10 лет назад.

2) Для этого специально и разрабатывали elf и shared libraries чтобы можно было делать манипуляции на уровне отдельных символов. Так работает, например, strip. Разделяемые библиотеки это очень гибкий инструмент который, например, даёт возможность к таким фичам как LD_PRELOAD.

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

Он не про шаредлибсы, а про «„псевдостатическая“ компоновка, с внедрением динамических библиотек,».

Подозреваю, эти красавцы внедряют динамическую либу в конечный объектник.

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

да я тоже про «динамическую либу в конечный объектник.». Именно по этому принципу либы и работают. Можно из одной либы две сделать(хз как, но теоретически возможно), можно из двух одну, в том и суть что манипуляциями с Procedure Linkage Table (PLT) такое возможно и с моей точки зрения не является грязным хаком.

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

вообще, надо посмотреть как именно работает, может там хаки грязнее некуда :)

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

Не трать на него свое время, он нубас

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.