如何编写可包装C可变参数函数的动态加载器
问题描述
为避免运行时对特定库产生硬依赖,我编写了一套动态加载器,通过dlopen/dlsym接口在运行时从目标库加载所需函数。构建阶段我使用包装函数,调用dlsym初始化得到的函数指针完成链接,但在处理可变参数函数时遇到问题:目前没有可行方法在动态加载这类函数后,正确转发其传入的可变参数。
我期望实现的可变参数支持包装库,需要满足以下约束:
- 无需提前获知可变参数的数量,也不要求使用哨兵值标记参数末尾
- 无需修改调用可变参数函数的上层代码(本场景中我不控制这部分代码的实现)
目前多数现有解答给出的变通方案,在我的使用场景下不具备实用性。
待包装目标函数
我需要包装的目标函数签名如下:
struct wl_proxy *wl_proxy_marshal_flags( struct wl_proxy *proxy, uint32_t opcode, const struct wl_interface *interface, uint32_t version, uint32_t flags, ...);
该函数由代码生成工具(参考wayland-scanner)输出的代码调用,但本问题并非专门针对Wayland场景。
注:此前已有大量同类问题被提出,例如C语言可变参数函数包装方法、C语言可变参数调用转发实现,但这些问题给出的类似
vfprintf的替代方案并不适用于我的场景。
内容的提问来源于stack exchange,提问作者ideasman42
相关产品推荐
相关产品推荐

