代码之家  ›  专栏  ›  技术社区  ›  Mathieu Westphal

glibc:测试lib是否为DF_1_NODELETE标志或lib是否具有唯一符号

  •  4
  • Mathieu Westphal  · 技术社区  · 9 年前

    我使用dlopen/dlclose加载glibc 2.21的lib。

    是否有C++调用将库检查为DF_1_NODELETE标志集? 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_。c: 762,标志在dl查找中设置。c:332

    关于DF_1_NODELETE标志和唯一符号的信息:

    DF_1_NODELETE

    Unique Symbol

    1 回复  |  直到 9 年前
        1
  •  1
  •   Employed Russian    9 年前

    这是为了避免在带有DF_1_NODELETE标志的lib上调用dlclose,因为调用它将失败,并出现断言错误:

    Inconsistency detected by ld.so: dl-close.c: 764: _dl_close: \
      Assertion `map->l_init_called' failed!
    

    如果正在呼叫 dlclose 在这样的库中,会导致上述断言,这是GLIBC中的错误,您应该在 glibc bugzilla .

    至于检测 DF_1_NODELETE (或任何其他)标志,是的,你可以通过 read Elf{32,64}_Ehdr 从图书馆开始,然后阅读 Elf{32,64}_Phdr s来自 .e_phoff 直到找到一个 .p_type == PT_DYNAMIC ,然后读取 Elf{32,64}_Dyn s来自其 .p_offset 直到你找到一个 .d_type == DT_FLAGS ,最后检查 .d_un.d_val & DF_1_NODELETE 为非零。