c++ - 构造函数的链接时自动注册

标签 c++ c shared-libraries static-libraries dlopen

我正在尝试构建一个服务/守护进程,以促进“小程序”在其进程信封内运行。该服务通过这些小程序调用的库公开功能。最重要的是,这里的要求是这些小程序都需要在与服务本身相同的进程边界内运行。小程序还需要在启动时向服务注册自身。

我想设计该服务,使其可以独立于这些小程序构建,并且其中不包含任何专门了解这些小程序的代码。

这里的一个选择是将小程序构建为共享库(.so),将它们全部放置在目标文件系统上的特定文件夹中,该文件夹在启动时由服务搜索,通过动态加载该文件夹中的所有 .so dl_open。通过在小程序本身中标记初始化函数__attribute__((constructor)),小程序就能够在初始化时向服务注册自身。

有静态/链接时版本吗?我已经尝试过建议here ,但无法阻止编译器优化每个小程序导出的全局函数注册表对象。使用 -Wl,--whole-archive 也不起作用,因为它在链接两个或多个此类小程序库时提示服务/守护程序库提供的函数的多个定义。

最佳答案

Is there a static/link-time version of this?

有,但是这样的解决方案无法满足您“可以独立于这些小程序构建服务”的需求。通过静态链接,服务和所有小程序都链接在一起,因此根据定义不能单独构建。

也就是说,-Wl,--whole-archive 是解决您的问题的正确解决方案。

doesn't work either since it complains of multiple definition of functions provided by the service/daemon library

不要将服务/守护程序库放入每个小程序库中(这样做没有任何意义)。将其放入自己的库中。这应该有效:

gcc main.o -Wl,--whole-archive -lapplet1 -lapplet2 ... -lservice -Wl,--no-whole-archive

关于c++ - 构造函数的链接时自动注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59684389/

相关文章:

c++ - 在 C++ 中捕获默认异常

c++ - 从 boost asio 客户端发送数据

c - 从 C 中的共享库访问主程序

java - 从gradle文件读取变量到库

c++ - 有没有办法为 fscanf 实现包装函数?

c++ - 子类型和子类之间有什么区别?

c - 如何在 Windows 上用 C 实现定时器

c - 编写一个 C 程序来调用另一个程序,而不使用任何内置库

c - 在 C 中编写面向 Lua 的函数时,检查参数是否支持类表查找的好方法是什么?

python - 了解Python中的config文件夹路径