当我们应该使用RTLD_DEEPBIND?
2022-03-11 23:19:17
请参阅一样的变量具有差别的地点。即使咱们从main.c中删除RTLD_DEEPBIND,则输出如预期。
处理计划您该当利用RTLD_DEEPBIND来确保符号正在加载库正在库中启动,它是依赖联系b查找全部名称空间中的符号。
这应承您正在库中利用与全部名称空间中可用的一样的定名符号,由于另一个载有一样界说的藏书楼;这或者是舛讹的,或导致题目。
当正在Linux *上创修静态链接到Intel运转时库的共享库时(比方,利用-static-intel选项),愿望使用法式将运转优化版本函数来自Intel供应的静态链接到共享库的函数库。比方,估计对像cos()云云的数学函数的挪用会解析为libimf,这是英特尔供应的包罗优化数学函数的数学库。正在Linux上,默认举动是将符号解析为这些例程的GNU libm版本。
至于第二个题目 - 咱们会看到反复的地点 - 这是您构修主使用法式而没有-fPIC选项的一个很棒的效用。即使咱们正在主使用法式中利用readelf -r,它有一行内容:
请当心这有_COPY结尾。这意味着当正在libdep.so中找到该符号时,它将复制复制到该地点的首要可实施文献的初始数据段中。然后查找libdep.so中对duplicate的援用,它指向位于$ b $libdep.so中的界说如下所示:
当您加载dynamic.so,它有它我方的符号吁请。由于利用RTLD_DEEPBIND,于是正在查看主可实施文献之前,起首正在该库的依赖联系中查找此界说。以是,它会从libdep.so中查找并利用公然的GLOB_DAT,而不是从a.out。
这是直接形成的链接到libdep.so举动编译dynamic.so。即使你没有链接到它,那么你会看到带有其他地点的符号 - 即首要exe文献中的副本。
这篇闭于当咱们该当利用RTLD_DEEPBIND?的作品就先容到这了,盼望咱们举荐的谜底对大众有所助助,也盼望大众众众接济IT屋!