Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Динамическая линковка статической либы


Автор: ashain 21.8.2012, 11:21
Вопрос в общем то таков, есть ли возможность подключить библиотеку lib***.a динамически как lib***.so, не добавляя её в исходный файл? Либо нужна обязательная перекомпиляция библиотеки?

Автор: Cheloveck 21.8.2012, 12:17
Статические библиотеки потому и называются статическими, что не подключаются динамически!

При статической компоновке линкер ищет символы в статической библиотеке, а при динамической "верит", что они будут доступны из динамической библиотеки.

Автор: ashain 21.8.2012, 12:28
Цитата(Cheloveck @ 21.8.2012,  12:17)
а при динамической "верит", что они будут доступны из динамической библиотеки.

Да, но ведь символы доступны и в статической библиотеке... 
Хотя из ответа я понял, что невозможно сделать динамическую линковку статической либы..

Автор: Cheloveck 21.8.2012, 12:42
Цитата(ashain @  21.8.2012,  13:28 Найти цитируемый пост)
Да, но ведь символы доступны и в статической библиотеке

В общем случае, статическая либа является объектным файлом, а динамическая имеет в заголовке таблицу символов.

Автор: tzirechnoy 21.8.2012, 14:22
Есть. Во-первых, можно при помощи ld из .a собрать .so. Ну, такжэ, как обычные .so собирают. В линуксе дажэ заработает -- там единственный косяк, что memory-mapped file для кода использоваться не будет, весь в память запихнётся и своп забьёт. Но это мелочи, на самом деле.

Во-вторых, исходники ld -- открыты, в freebsd и dietlibc они дажэ довольно банальны. Никакого rocket science, открываешь файл, читаешь заголовки, в соответствии с заголовками -- читаешь и правишь содержымое, подставляешь в свои таблицы полученные адреса. Напишы (допили diet-ский) ld для загрузки .a, и оформи в свою библиотеку.

PS И да, фразу "не добавляя в исходный файл" я вообще не понял, но понадеялся, что она здесь не важна.

Автор: ashain 23.8.2012, 11:00
Цитата(tzirechnoy @ 21.8.2012,  14:22)
Есть. Во-первых, можно при помощи ld из .a собрать .so. Ну, такжэ, как обычные .so собирают. В линуксе дажэ заработает -- там единственный косяк, что memory-mapped file для кода использоваться не будет, весь в память запихнётся и своп забьёт. Но это мелочи, на самом деле.

Во-вторых, исходники ld -- открыты, в freebsd и dietlibc они дажэ довольно банальны. Никакого rocket science, открываешь файл, читаешь заголовки, в соответствии с заголовками -- читаешь и правишь содержымое, подставляешь в свои таблицы полученные адреса. Напишы (допили diet-ский) ld для загрузки .a, и оформи в свою библиотеку.

PS И да, фразу "не добавляя в исходный файл" я вообще не понял, но понадеялся, что она здесь не важна.

Под исходным файлом имел ввиду файл использующий библиотеку... Хотя наверное не совсем корректно звучит, да и действительно не суть...
Спасибо за остальную информацию, будем смотреть.

Автор: ashain 23.8.2012, 13:05
Цитата(tzirechnoy @ 21.8.2012,  14:22)
Есть. Во-первых, можно при помощи ld из .a собрать .so. Ну, такжэ, как обычные .so собирают. В линуксе дажэ заработает -- там единственный косяк, что memory-mapped file для кода использоваться не будет, весь в память запихнётся и своп забьёт. Но это мелочи, на самом деле.

Спасибо за наводку о конвертации, всё оказалось банально просто:
Код

ar -x lib***.a
gcc -shared *.o -o lib***.so

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)