gpt4 book ai didi

c++ - 为什么这个库 dlopen 顺序很重要?

转载 作者:IT王子 更新时间:2023-10-29 00:35:07 24 4
gpt4 key购买 nike

我有一个 CandData 库,这样(相关的)$ nm libCandData.so:

             U _ZN10CandHandle13SetCandRecordEP10CandRecord
U _ZN10CandHandle7SetLockEv
000000011610 T _ZNK10CandRecord13GetCandHeaderEv
U _ZTI10CandHandle

还有一个库 Candidate $ nm libCandidate.so:

00000001f018 T _ZN10CandHandle13SetCandRecordEP10CandRecord
00000001f270 T _ZN10CandHandle7SetLockEv
U _ZNK10CandRecord13GetCandHeaderEv
000000241500 V _ZTI10CandHandle

因此,它们具有循环依赖关系。我可以先通过延迟加载 Candidate 来加载这些,按照这个顺序,一切正常:

dlopen("libCandidate.so", RTLD_LAZY | RTLD_GLOBAL);
dlopen("libCandData.so", RTLD_NOW | RTLD_GLOBAL);

但首先尝试延迟加载 CandData:

dlopen("libCandData.so",  RTLD_LAZY | RTLD_GLOBAL);
dlopen("libCandidate.so", RTLD_NOW | RTLD_GLOBAL);

导致 dlopen 报告:

dlopen Error: libCandData.so: undefined symbol: _ZTI10CandHandle

我不明白的是为什么这个顺序很重要?据我了解,V 表示该符号是弱链接但具有默认定义,因此可以看出可能没有必要立即解决。但是这两个库都具有 U->T 依赖性。

为什么一个命令有效,而另一个无效?

最佳答案

What I don't understand is why this order matters?

顺序很重要,因为虽然未解析的函数 引用可以延迟解析,但数据 引用不能(并且_ZTI10CandHandle 不是函数)。

与其查看 nm 输出,不如查看重定位(使用 readelf -Wr)。您会发现 libCandidate.so 中符号 _ZTI10CandHandle 的重定位类型不同于 libCandData.so 中符号 _ZN10CandHandle7SetLockEv 的重定位类型

关于c++ - 为什么这个库 dlopen 顺序很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26042327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com