3

我正在编写一个 (C) 程序,它通过 dlopen() 使用插件系统。我遇到的绊脚石是主程序导出了一些真正需要知道调用它们的插件的函数(主要是记录保存,因此插件可以正确卸载,因为它们向主程序添加函数指针之类的东西程序)。

我似乎找不到一种干净的方法来做到这一点。到目前为止我提出的选项:

  1. 要求插件提供其名称,或者我在加载时提供的一些数据作为函数的参数。
    • 我不喜欢这个选项,因为不是所有的函数都关心它们是从谁调用的,所以它使它不一致和混乱。另外,我想让插件尽可能难以谎报它是谁
  2. 使用 backtrace() 确定前一个函数的对象名称。
    • 这看起来相当丑陋且不可移植。
  3. 要求插件放置一个包含其名称的文件级结构(或其他变量)(我们称之为“plugin_info”进行讨论)。然后在加载插件时使用 dlsym() 来查找变量并按其名称对其进行索引(如在哈希中)。然后放入插件用来调用函数的#define 宏,并将宏添加&plugin_info为参数。
    • 这就是我现在正在使用的,但它看起来很hackish。对于一个你必须有宏传递'&plugin_info',如果你只是传递'plugin_info'那么它会从主程序中提取'plugin_info',而不是插件。通过地址引用它似乎可以使它用正确的编译,并且它不会被重新定位。这让我不喜欢这个选项,因为这似乎是它未定义的行为,但它确实有效。此外,当插件开发人员遇到函数调用问题(传递错误的参数类型或诸如此类的东西)时,宏也会让人有点困惑。

如果有任何其他想法或技术,我很想知道。

4

1 回答 1

2
  1. 你已经邀请插件进入你的地址空间,所以它可以撒谎,覆盖属于调用者的内存,或者rm -rf ~如果它喜欢。如果这是一个问题,您需要在没有特权的单独进程中将其沙箱化。
  2. 事实上,这是非常不可移植的。
  3. 这通常是正确的想法,但你把它搞砸了,让它变得丑陋。添加staticplugin_info的定义中,您将拥有完美定义的行为,并且没有任何黑客行为。
于 2011-01-22T13:22:04.880 回答