Я хочу изменить существующую разделяемую библиотеку так, чтобы она использовала разные подпрограммы управления памятью в зависимости от приложения, использующего разделяемую библиотеку.
(На данный момент) будет два семейства подпрограмм управления памятью:
- Стандартные функции malloc, calloc и т. Д.
- специализированные версии malloc, calloc и т. Д.
Я нашел потенциальный способ решения этой проблемы (спомощь некоторых людей здесь на SO).Есть еще несколько серых областей, и я хотел бы получить отзыв о моем предложении.
Вот как я собираюсь реализовать модификацию:
Заменить существующие вызовыmalloc / calloc и т. д. с помощью my_malloc / my_calloc и т. д. Эти новые функции будут вызывать правильно назначенные указатели функций вместо вызова жестко закодированных имен функций.
Предоставляют механизм для общей библиотеки для инициализацииуказатели на функции, используемые my_malloc и т. д. для указания на стандартные подпрограммы mgmt памяти C - это позволяет мне обеспечивать обратную совместимость для приложений, которые зависят от этой разделяемой библиотеки - поэтому их не нужно изменять.В C ++ я мог бы сделать это, используя статическую переменную инициализации (например) - я не уверен, можно ли использовать тот же «шаблон» в C.
Введите новыйИдемпотентная функция Функция initAPI (тип), которая вызывается (при запуске) приложением, которому необходимо использовать различные подпрограммы mem mgmt в совместно используемой библиотеке.Функция initAPI () назначает функции памяти mgmt ptrs соответствующим функциям.
Ясно, что было бы предпочтительно, если бы я мог ограничить, кто может вызывать initAPI () или когда он вызывался - например, функция НЕ должна вызываться после того, как вызовы API были сделаны длябиблиотека - как это изменит подпрограммы mgmt памяти.Поэтому я хотел бы ограничить, где и кем это называется.Это проблема доступа, которую можно решить, сделав метод закрытым в C ++, я не уверен, как это сделать в C.
Проблемы в 2 и 3 выше могут быть тривиально решены в C ++, однако яя вынужден решать эти проблемы в C.
Наконец, предполагая, что указатели функций могут быть правильно установлены во время инициализации, как описано выше - у меня есть второй вопрос, касающийся видимостиглобальные переменные в разделяемой библиотеке, через различные процессы, использующие разделяемую библиотеку.Указатели на функции будут реализованы как глобальные переменные (я не слишком обеспокоен безопасностью потоков НА СЕЙЧАС - хотя я предполагаю обернуть доступ с блокировкой мьютекса в какой-то момент) * и каждое приложение, использующее разделяемую библиотеку, не должно мешать процедурам управления памятьюиспользуется для другого приложения, использующего разделяемую библиотеку.
Я подозреваю, что это код (не данные), который разделяется между процессами, использующими shlib - однако, я хотел бы, чтобы это было подтверждено - предпочтительно, со ссылкой, которая создает резервную копиюэто утверждение.
* Примечание: если я наивно преуменьшаю проблемы с потоками, которые могут возникнуть в будущем из-за описанной выше «архитектуры», кто-то, пожалуйста, предупредите меня! ..
Кстати, я собираю библиотеку на Linux (Ubuntu)