C++ glibc:测试lib是否作为DF_1_NODELETE标志,或者lib是否具有唯一符号

C++ 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

我使用dlopen/dlclose来加载glibc2.21中的lib

是否有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,就没有必要了。