LINUX.ORG.RU

Полустатическая сборка программ


0

0

Всем привет!

Я собрал программу, сделал ldd my_prog и заметил, что программа
зависит от большого числа динамических библиотек.

Затем я указал g++ опцию -static и получил статический бинарник,
который ни от чего не зависит.

Возник вопрос, а можно ли сделать бинарник статическим, но при
этом чтобы от одной либы он всё же зависил динамически (не хочется 
её вкомпиливать)?

Можно, но не просто: от версии к версии gcc и libc все меняется.

Простейший способ, скажем, воткнуть статически библиотеку "qwerty": g++ -Xlinker -Bstatic -lqwerty -Xlinker -Bdynamic -lпрочиелибы...

(вместо -Xlinker option можно короче, -Wl,option )

Die-Hard ★★★★★
()

Вдогонку:

g++ -- вещь в себе. Если нужен полный контроль над линковкой, то надо в качестве фронтенда пользовать gcc и указывать stdc++ (а, может, и не только stdc++) явно. И все это будет зависеть от версии.

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

> Если нужен полный контроль над линковкой, то надо в качестве фронтенда пользовать gcc и указывать stdc++ (а, может, и не только stdc++) явно

это как? вы имели в виду gcc -x c++ ... или что-то иное?

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

h8:

> а что, нельзя требуемую библиотеку подключать динамически?

Можно!

Только надо знать, какие библиотеки и в какой последовательности подсовывать линкеру. А это будет отличаться от версии к версии.

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

при динамическом подключении линковщик вообще ничего не знает о библиотеке. Поэтому и зменения от версии к версии никак не влияют

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

h8 (21.09.2005 0:42:47):

> при динамическом подключении линковщик вообще ничего не знает о библиотеке. Поэтому и зменения от версии к версии никак не влияют

Ну, во-первых, влияют, особенно при RTLD_NOW.

Во-вторых, ldopen() ни разу не POSIX и вообще с соляриса пришел.

Но главное, речь-то о совершенно другом шла. Грузить библиотеки "вручную", естественно, никто не запрещает, но это уже совершенно другая история.

Die-Hard ★★★★★
()
Ответ на: комментарий от h8

Это грязный хак, а не решение. Огребешь больше проблем чем решишь

anonymous
()
Ответ на: комментарий от h8

> Не понял. Причем тут это? Я говорил про void* handle = dlopen("./libfoo.so", RTLD_LAZY);

Ничего подобного, говорил ты совсем о другом ;-)

anonymous
()
Ответ на: комментарий от Die-Hard

> Компиляция, ессно, g++. А линковка gcc с -lstdc++

а не проще ли в этом случае ld напрямую юзать? как минимум, отпадет путаница с -Wl,blah-blah

ananas ★★★★★
()
Ответ на: комментарий от Die-Hard

> Во-вторых, ldopen() ни разу не POSIX и вообще с соляриса пришел.

man dlopen :

<skipped>...</skipped>

HISTORY The dlopen interface standard comes from SunOS. That system also has dladdr, but not dlvsym.

CONFORMING TO POSIX 1003.1-2003 describes dlclose, dlerror, dlopen, dlsym.

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

2sf (21.09.2005 14:52:15):

>CONFORMING TO POSIX 1003.1-2003

Ну, значит, теперь -- POSIX.

Я бы поостерегся на последнюю-то версию стандарта закладываться...

Die-Hard ★★★★★
()
Ответ на: комментарий от sf

sf:

>а нельзя ли библиотекуописать более явно?

Насколько мне известно, нет.

Die-Hard ★★★★★
()
Ответ на: комментарий от ananas

ananas

> > Компиляция, ессно, g++. А линковка gcc с -lstdc++

> а не проще ли в этом случае ld напрямую юзать?

Для игр с частично статической линковкой, конечно, проще.

А для полностью статической линковки с нестандартными библиотеками проще gcc, меньше зависимостей от версии gcc будет.

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