Всем доброго дня!
Занимаюсь разработкой архитектуры своего проекта. Появилась идея разбить функционал на независимые модули, оформленные в виде библиотек .so, а общий функционал реализовать в виде ядра программы. То есть фактически ядро будет являться диспетчером, вызывающим модули из библиотек. В ядре же собираюсь разместить функции, связанные с обеспечением хранения настроек, состояния модулей и тд. В связи с этим прочитал ряд статей по поводу динамических библиотек, провел несколько экспериментов и все равно остались некоторые вопросы.
Во-первых, можно ли сделать так, чтобы ядро программы экспортировало некоторый набор функций (а именно функции работы с конфигурацией и состоянием модуля), которые бы импортировались подключаемыми динамическими библиотеками-модулями? В свою очередь библиотеки-модули экспортировали свои интерфейсные функции, которыми бы пользовалось ядро для обращения к модулям. Второе вроде как понятно, для этого и создаются so. Но вот про использование из .so функций из подлинковавшей ее программы нигде не нашел упоминания.
Во-вторых, исследуя получающиеся на выходе компилятора .so с помощью readelf обнаружил, что среди символов лежат все присутствующие в коде библиотеки функции. Это не есть хорошо: они занимают лишнее место, да и незачем выставлять на показ внутренние функции. В этом вопросе мне вспоминается опыт написания dll в NT - там я помечал функции, которые я хочу экспортировать. Более того, мне вспоминается, что при ручном импортировании функций из библиотеки в NT как-то можно было вообще не использовать имена функций, а лишь ее номер. Мне кажется в данном случае это было бы даже оправданно. И выкинуть имена всех символов, чтобы кто не знает - не пользовался. Можно ли сделать экспорт только нужных функций и по возможности с доступом не по именам, а по номерам?
В-третьих, в статье "Анатомия динамических библиотек Linux" прочитал, что при подгрузке библиотеки, у нее автоматически вызывается функция инициализации. Иногда ее иметь действительно полезно. Но, действуя по описанию, фактически я только добавил ключ компиляции у gcc и не создавал никаких процедур. Компилятор не заругался. Можно ли добавить процедуру инициализации и деинициализации в библиотеку или в статье наврали?
И, наверное, тупой вопрос. Можно ли загрузить библиотеку из ее mmap образа или напрямую из фрагмента файла без сохранения на диск во временный файл? Это для быстрого холодного старта из архива поставки продукта.