C语言 如何在二进制文件中检查共享库版本



我有一个程序在启动时与一些共享库链接。主机上安装了多个版本的库。是否有一些函数或宏可以检查链接到我的程序的库版本?我想要这样的东西:

int main() {
    REQUIRE_LIBRARY_VERSION_GREATER("libgcc", 1, 2, 3); //example
}

在 unix 中可能吗?我至少在linux和freebsd上需要它。

编辑:如果可能的话,我宁愿避免fork/exec。

我使用dl_iterate_phdr函数来找出加载了哪些共享对象。这是打印共享库信息的 dl 处理程序的示例

static int header_handler(struct dl_phdr_info* info, size_t size, void* data)
{
    printf("name=%s (%d segments) address=%pn",
            info->dlpi_name, info->dlpi_phnum, (void*)info->dlpi_addr);
    for (int j = 0; j < info->dlpi_phnum; j++) {
         printf("tt header %2d: address=%10pn", j,
             (void*) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));
         printf("ttt type=%u, flags=0x%Xn",
                 info->dlpi_phdr[j].p_type, info->dlpi_phdr[j].p_flags);
    }
    printf("n");
    return 0;
}

它取自这里

它为我的视频处理项目打印如下:

name=/usr/local/lib/libopencv_highgui.so.2.4 (7 segments) address=0x7f467935a000
name=/usr/local/lib/libopencv_imgproc.so.2.4 (7 segments) address=0x7f46796e9000
...

Opencv 包含库名称中的版本 libopencv_imgproc.so*.2.4* 。这样我就知道加载了 opencv 版本。我不知道它是否对你的图书馆有好处,但它可以成为你的起点。

ldd 命令列出可执行文件的共享库

ldd <executable>

最新更新