You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dlopen加载Wayfire插件遇未定义符号及API/ABI版本校验问题

问题

我需要确认firedecor插件是否基于足够新版本的Wayfire编译,确保其API/ABI版本与当前Wayfire匹配,以此判断是否需要重编译。为此我写了一个C++程序:通过dlopen加载插件,调用getWayfireVersion获取版本,再和当前Wayfire头文件中的WAYFIRE_API_ABI_VERSION对比。

编译命令是:

g++ test.cc -o test -Wall -ldl $(pkg-config --cflags pixman-1) -DWLR_USE_UNSTABLE

但运行时出现错误:

dlopen failed: /usr/lib/aarch64-linux-gnu/wayfire/libfiredecor.so: undefined symbol: _ZTIN2wf3txn20transaction_object_tE

用nm查看后发现,这个符号在插件中未定义,本应由加载它的可执行文件提供。我想知道:

  1. 如何修改程序或编译命令,让test二进制包含wf::txn::transaction_object_t的typeinfo(占位值即可)?
  2. 编译插件时使用gold的--weak-unresolved-symbols选项是不是正确的解决方案?

解决方案

一、让测试程序提供所需的typeinfo

要生成wf::txn::transaction_object_t的typeinfo,最简单的方式是在测试程序中声明并实例化这个类的空占位版本,不需要实现任何成员函数——因为插件只需要它的typeinfo符号,不需要实际功能。

具体操作:

  1. 在test.cc中添加以下代码:
namespace wf::txn {
    // 声明占位类,匹配插件期望的类名与命名空间
    class transaction_object_t {};
}

// 强制编译器生成该类的typeinfo符号
wf::txn::transaction_object_t dummy_txn_obj;

如果不想实例化对象,也可以通过typeid触发typeinfo生成:

namespace wf::txn {
    class transaction_object_t {};
}

const auto& dummy_type = typeid(wf::txn::transaction_object_t);
  1. 用原编译命令重新编译即可,编译器会自动生成对应的typeinfo符号。编译后可以用nm -C test | grep transaction_object_t验证,能看到类似typeinfo for wf::txn::transaction_object_t的条目就说明符号已存在。

二、关于gold链接器的--weak-unresolved-symbols选项

这个选项不是正确的解决方案,原因如下:

  • 该选项会让链接器把未解析的符号标记为弱符号,插件加载时找不到符号会用默认值(比如nullptr)代替,但插件实际需要依赖transaction_object_t的typeinfo完成RTTI操作(比如dynamic_cast),缺失后会直接引发运行时崩溃。
  • Wayfire插件的设计逻辑是核心符号由主程序(Wayfire或你的测试程序)提供,而非让插件忽略缺失符号。

内容的提问来源于stack exchange,提问作者josch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:22:39