加载共享对象的故障安全方式

Failsafe way to load Shared Object

我目前正在使用 GLib g_module 函数在运行时加载一些共享对象。

我使用的基本方法如下:

  1. 调用g_module_open获取模块
  2. 之后调用g_module_make_resident
  3. 使用 g_module_symbol
  4. 加载符号

因为我使用它作为添加插件兼容性的基本方法,我很感兴趣是否有一种好的方法来确保即使加载的模块有错误(如内存损坏(malloc /free)) 主应用程序可以 'catch' 这个错误而不会使一切崩溃?

我真的不想让你写任何代码,我只是想知道有没有好的方法来实现这个...

正如 Severin 所提到的,没有什么事情可以轻松完成。也就是说,您确实有几个选择:

您可能要考虑的第一件事是使用类似 libpeas 的东西,它允许您使用非 C 链接的语言(JavaScript、Python 等)加载插件。许多这些语言提供的安全性比 C 高得多,因此如果您试图防止程序员错误(而不是恶意模块),这可能是一个不错的方法。

实现此目的的另一种相对直接的方法是 运行 每个插件在一个单独的进程中。您可以通过 D-Bus、管道等进行通信。这种方法的一个优点是某些模块可以拥有较少的权限;如果您有一个与可能需要 root 权限的硬件交互的程序,但您的 UI 仍然可以 运行 作为非特权用户。心灵感应就是这种架构的一个例子。