c++ - 列出在 Linux 上使用 C/C++ 执行的程序中的共享库

标签 c++ linux dynamic-library

我想知道在 Linux 上执行 C/C++ 程序时加载了哪些动态库。

例如,

int main()
{
    ...
    list = GetAllSharedLibraryFilePaths();
}

列表应包含:libm.so.6、librt.so.1、... 或者路径:/lib/x86_64-linux-gnu/libm.so.6,/lib/x86_64-linux-gnu/librt.so.1 ...

是否有返回所有共享库文件路径的 API? 我知道 lddreadelf 可以做到这一点,但我需要在加载共享库的可执行文件中使用 C/C++ 编程来做到这一点。

谢谢。

最佳答案

您可以使用非标准 dl_iterate_phdr(3)函数遍历加载的共享对象列表。

#define _GNU_SOURCE
#include <link.h>
#include <stdio.h>

int print(struct dl_phdr_info *info, size_t size, void *data) {
  printf("%s\n", info->dlpi_name);
  return 0;
}

int main() {
  dl_iterate_phdr(print, NULL);
  return 0;
}
$ gcc test.c -o test
$ ./test

linux-vdso.so.1
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

关于c++ - 列出在 Linux 上使用 C/C++ 执行的程序中的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59258867/

相关文章:

gcc - 使用 gcc --shared -m64 -Wl,--whole-archive ./*.a 从静态库制作动态库

c++ - 构造函数参数的条件

c++ - 将 C++ 实例方法分配给全局函数指针?

c++ - 用 '%20' 替换字符串中的所有空格 (C++)

c - 串行通信重置/etc/profile (linux)

Xcode:如何将我的 .app 项目构建为共享库?

C++ 开始()和结束()

c - 让 gcc 以 "int 0x80"方式编译系统调用?

c++ - 等效于 Linux 上的 SetThreadPriority (pthreads)

c - C 中的共享库和动态库有什么区别?