linux环境 如何看运行进程搜索动态链接库的路径列表
时间: 2023-11-19 12:04:19 浏览: 74
要查看运行中的进程和它们使用的动态链接库路径,可以使用以下命令:
1. 查看正在运行的进程列表:
```
ps -ef
```
2. 找到你想要查看的进程的PID。
3. 通过/proc目录的PID进程文件夹来查看有关该进程的信息,其中包括该进程使用的动态链接库路径列表:
```
ls -l /proc/<PID>/maps
```
其中,<PID>为步骤2中找到的进程PID。
4. 查找包含动态链接库的路径:
```
grep "\.so" /proc/<PID>/maps
```
这将列出所有包含.so文件的路径。
相关问题
linux环境 dladdr函数获取不到动态库的绝对路径
在 Linux 环境下,`dladdr` 函数可以用来获取某个函数或变量所在的动态库的信息,包括动态库的绝对路径。但是有时候我们会发现,`dladdr` 函数返回的 `Dl_info` 结构体中的 `dli_fname` 成员并不是动态库的绝对路径,而只是动态库的文件名。
这个问题通常是由于动态库的加载方式导致的。在 Linux 中,动态库可以通过 `LD_LIBRARY_PATH` 环境变量来指定搜索路径。如果动态库被加载时,其路径在 `LD_LIBRARY_PATH` 中,那么 `dli_fname` 中就只包含动态库的文件名,而不是绝对路径。
为了解决这个问题,可以使用 `dl_iterate_phdr` 函数遍历当前进程中加载的所有动态库,然后通过比较动态库的基地址和 `dli_fbase` 成员来找到相应的动态库,从而获取其绝对路径。下面是一个示例代码:
```c
#include <dlfcn.h>
#include <link.h>
#include <stdio.h>
#include <string.h>
void* func;
int callback(struct dl_phdr_info* info, size_t size, void* data)
{
if (func >= (void*)info->dlpi_addr && func < (void*)(info->dlpi_addr + info->dlpi_phdr[0].p_vaddr + info->dlpi_phdr[0].p_memsz))
{
printf("Library path: %s\n", info->dlpi_name);
return 1;
}
return 0;
}
int main()
{
func = dlsym(RTLD_DEFAULT, "some_function");
struct Dl_info info;
if (dladdr(func, &info))
{
if (info.dli_fname[0] != '/')
{
dl_iterate_phdr(callback, NULL);
}
else
{
printf("Library path: %s\n", info.dli_fname);
}
}
return 0;
}
```
这个示例代码中,我们首先使用 `dlsym` 函数获取某个函数的地址,然后使用 `dladdr` 函数获取该函数所在的动态库的信息。如果 `dli_fname` 成员中包含了绝对路径,那么直接打印即可。否则,我们就使用 `dl_iterate_phdr` 函数遍历动态库,找到包含该函数的动态库,最后打印其绝对路径。
需要注意的是,使用 `dl_iterate_phdr` 函数需要链接 `libdl` 库。在编译时需要加上 `-ldl` 选项。
linux 动态链接库初始化
在Linux中,动态链接库的初始化通常是通过动态链接器(ld.so)来完成的。
当一个程序使用到了某个动态链接库时,操作系统会使用动态链接器来加载和初始化该库。动态链接器会检查程序中对该库的引用,并根据指定的搜索路径来查找库文件。一旦找到库文件,动态链接器会将该库加载到进程的虚拟地址空间中。
动态链接器在加载和初始化动态链接库时,会执行以下几个步骤:
1. 打开库文件:动态链接器会使用系统调用(如open)打开库文件,以便读取和加载库中的代码和数据。
2. 解析符号:动态链接器会解析库中的符号。这包括解析库中所有的函数和全局变量的地址,并将其与程序中对应的符号进行匹配。
3. 分配空间:动态链接器会为库代码和全局变量分配内存空间,并将其加载到进程的虚拟地址空间中。
4. 修复引用:动态链接器会修改程序中对库的符号的引用,使其指向在内存中的正确地址。
5. 执行初始化:动态链接器会执行库的初始化函数,进行一些初始化操作,例如初始化全局变量、注册回调等。
6. 设置共享:动态链接器会将库设置为共享状态,这样其他进程也可以使用该库。
通过以上步骤,动态链接器能够成功地加载和初始化动态链接库,使得程序能够正确地使用库中提供的功能和资源。动态链接库的使用不仅可以减小程序的体积,还可以提供代码的复用和维护的便利性。