определение вызывающего объекта при работе с объектами dlopen () - PullRequest
3 голосов
/ 22 января 2011

Я пишу (C) программу, которая использует систему плагинов через dlopen ().Камень преткновения, с которым я сталкиваюсь, заключается в том, что основная программа экспортирует несколько функций, которым действительно нужно знать плагин, который их вызвал (в основном, ведение записей, и поэтому плагин может быть выгружен правильно, так как он добавляет такие вещи, как указатели на функции в основнойпрограмма).

Я не могу найти чистый способ сделать это.Опции, которые я до сих пор предлагал:

  1. требуют, чтобы плагин предоставлял свое имя, или некоторые данные, которые я передаю при загрузке, в качестве аргумента для функций.
    • Мне не нравится эта опция, потому что не все функции заботятся о том, от кого они были вызваны, поэтому это делает их непоследовательными и грязными.Кроме того, я хотел бы сделать так, чтобы плагину было как можно сложнее лгать о том, кто он такой:
  2. Используйте backtrace (), чтобы определить имя объекта предыдущей функции.
    • Это выглядит довольно уродливо и непереносимо.
  3. Требуется, чтобы плагин поместил структуру уровня файла (или другую переменную), содержащую его имя (давайте назовем его'plugin_info' для обсуждения).Затем используйте dlsym () при загрузке плагина, чтобы найти переменную и проиндексировать ее (как в хэше) по ее имени.Затем вставьте в макрос #define, который используют плагины для вызова функций, и добавьте макрос &plugin_info в качестве аргумента.
    • Это то, что я сейчас использую, но кажется хакерским.Для одного вы должны пройти макрос '& plugin_info', если вы просто передадите 'plugin_info', то он извлекает 'plugin_info' из основной программы, а не из плагина.Ссылка на него по адресу, кажется, делает его таким, чтобы он компилировался с правильным, и что он не перемещался.Это заставляет меня не любить эту опцию, так как она выглядит как неопределенное поведение, однако она работает.Также макросы могут немного сбивать с толку, когда у разработчика плагина возникает проблема с вызовом функции (передача неверного типа аргумента или еще много чего).

Если есть другие идеи илитехники, я хотел бы любить знать.

1 Ответ

2 голосов
/ 22 января 2011
  1. Вы пригласили плагин в свое адресное пространство, чтобы он мог лгать, перезаписывать память, принадлежащую вызывающей стороне, или rm -rf ~, если ему нравится.Если это проблема, вам нужно поместить ее в отдельный процесс без привилегий.
  2. Действительно, это ужасно непереносимо.
  3. Как правило, это правильная идея, но вы испортилиэто и сделало это уродливым.Добавьте static к определению plugin_info, и вы получите совершенно четко определенное поведение, а не хакерство.
...