C++ glibc:测试lib是否作为DF_1_NODELETE标志,或者lib是否具有唯一符号
我使用dlopen/dlclose来加载glibc2.21中的libC++ glibc:测试lib是否作为DF_1_NODELETE标志,或者lib是否具有唯一符号,c++,unique,glibc,dlopen,C++,Unique,Glibc,Dlopen,我使用dlopen/dlclose来加载glibc2.21中的lib 是否有C++调用来检查作为DFE11NODELADE标志集的LIB? readelf似乎能够做到这一点 或者至少库中定义了唯一的符号? nm绝对能够做到这一点 理想情况下,我想要的是: CloseLib( libHandle lib) { if( checkIfLibIsClosable(lib) ) { dlclose(lib) } } 这是为了避免使用DF_1_NODELETE标志在lib上调用dl
是否有C++调用来检查作为DFE11NODELADE标志集的LIB? readelf似乎能够做到这一点
或者至少库中定义了唯一的符号? nm绝对能够做到这一点 理想情况下,我想要的是:CloseLib( libHandle lib)
{
if( checkIfLibIsClosable(lib) )
{
dlclose(lib)
}
}
这是为了避免使用DF_1_NODELETE标志在lib上调用dlclose,因为调用它将失败并出现断言错误:
Inconsistency detected by ld.so: dl-close.c: 764: _dl_close: Assertion `map->l_init_called' failed!
这是由dl close中设置的DF_1_NODELETE标志引起的。c:762,该标志在dl lookup中设置。c:332
关于DF_1_节点标记和唯一符号的信息:
这是为了避免使用DF_1_NODELETE标志在lib上调用dlclose,因为调用它将失败并出现断言错误:
Inconsistency detected by ld.so: dl-close.c: 764: _dl_close: Assertion `map->l_init_called' failed!
如果对这样的库调用dlclose
导致上述断言,则这是GLIBC中的一个bug,您应该在中报告它
至于检测
DF_1_NODELETE
(或任何其他)标志,可以通过read
从库的开始处读取Elf{32,64}Ehdr
,然后从读取Elf{32,64}Phdr
偏移量,直到找到一个.p\u type==PT\u DYNAMIC
,然后读取Elf{32,64}\u Dyn
s从它的.p\u偏移量
直到你找到一个.d\u type==DT\u FLAGS
,最后检查它的.d\u un.d\u val&dfu 1\u NODELETE
是否为非零。我已经在libc-ml上发送了一封邮件,我们会看看。关于你的检测方法,它看起来是可行的,但如果它是一个bug,就没有必要了。