如何在提供库地址时获取共享库中符号的地址?

How to get address of a symbol in a shared library when provided address of the library?

我正在 Linux 学习如何在 C/C++ 中使用共享库。遇到了一个小问题不知道怎么解决

假设我有一个共享库和一个可执行文件。但是我不知道图书馆的名称或文件位置(所以我不能 dlopen 它)。我只能找到库映射到我的可执行文件内存的地址范围。

有没有办法以编程方式获取库的句柄(类似于 handle = dlopen(library_address))或库中符号的偏移量(类似于 address = dlsym(library_address, symbol_name))?

如果您知道图书馆的名称,您可以再次调用 dlopen

来自man page

If the same shared object is loaded again with dlopen(), the same object handle is returned.

要发现加载的模块,您可以使用dl_iterate_phdr()

您也可以使用dladdr()查询具体地址