Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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:42 |
В общем случае, статическая либа является объектным файлом, а динамическая имеет в заголовке таблицу символов. |
Автор: 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 | ||
Под исходным файлом имел ввиду файл использующий библиотеку... Хотя наверное не совсем корректно звучит, да и действительно не суть... Спасибо за остальную информацию, будем смотреть. |
Автор: ashain 23.8.2012, 13:05 | ||||
Спасибо за наводку о конвертации, всё оказалось банально просто:
|