Можно ли загрузить общую библиотеку в общую память? - PullRequest
2 голосов
/ 15 мая 2010

У меня есть сервер и клиент, написанные на C. Я пытаюсь загрузить общую библиотеку на сервер, а затем передать указатели на библиотечные функции клиенту. Таким образом, я могу изменить библиотеку без необходимости компиляции клиента.

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

Ответы [ 2 ]

4 голосов
/ 15 мая 2010

По определению разделяемая библиотека является общей, поэтому два процесса будут использовать одну и ту же физическую память для сегмента кода библиотеки. Таким образом, вместо того, чтобы создавать какие-то хитроумные схемы, вы можете просто передать имена библиотеки и функции от сервера к клиенту, и клиент получит адрес функции, используя dlopen() + dlsym().

Обратите внимание, что в этом случае будет две копии сегментов данных (если в библиотеке есть некоторые глобальные или статические переменные), например, если сервер устанавливает некоторую переменную static внутри библиотечной функции, ее значение не изменится для клиента.

0 голосов
/ 15 мая 2010

Возможно, вы могли бы, если бы ОС не назвала выполнение разделяемой памяти также проблемой безопасности (что, вероятно, и должно быть).

Но тебе не нужно. И вы не должны передавать указатели другим процессам. Вместо этого дайте названия функций или кодовые точки в вашем протоколе. Механизм разделяемой библиотеки будет означать, что в памяти находится только одна копия библиотеки, если ОС не решит не делиться по какой-то причине. Если операционная система решит не предоставлять доступ, возможные причины этого обычно приводят к тому, что ваш трюк с передачей указателя также не срабатывает.

...