如何获取当前库路径

时间:2017-04-25 09:45:52

标签: c++ linux

我有一个动态加载的插件(.so文件)。在与.so文件相同的文件夹中,我有一些图像。插件必须实现的一个功能是返回图像的路径。

如何从C ++(或C)中获取.so的绝对路径?

我知道问题可以通过可执行文件轻松解决(图像与.so位于同一文件夹中),但遗憾的是我无法访问其源代码。

1 个答案:

答案 0 :(得分:3)

在Linux上,/proc/self/maps将列出当前加载的每个共享对象的完整路径。 Per the proc.5 man page

/proc/[pid]/maps
     

包含当前映射的内存区域及其访问权限的文件。有关更多信息,请参阅mmap(2)   有关内存映射的信息。

     

...

     

该文件的格式为:

   address           perms offset  dev   inode       pathname
   00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon
   00651000-00652000 r--p 00051000 08:02 173521      /usr/bin/dbus-daemon
   00652000-00655000 rw-p 00052000 08:02 173521      /usr/bin/dbus-daemon
   00e03000-00e24000 rw-p 00000000 00:00 0           [heap]
   00e24000-011f7000 rw-p 00000000 00:00 0           [heap]
   ...
   35b1800000-35b1820000 r-xp 00000000 08:02 135522  /usr/lib64/ld-2.15.so
   35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522  /usr/lib64/ld-2.15.so
   35b1a20000-35b1a21000 rw-p 00020000 08:02 135522  /usr/lib64/ld-2.15.so
   35b1a21000-35b1a22000 rw-p 00000000 00:00 0
   35b1c00000-35b1dac000 r-xp 00000000 08:02 135870  /usr/lib64/libc-2.15.so
   35b1dac000-35b1fac000 ---p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
   35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870  /usr/lib64/libc-2.15.so
   35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870  /usr/lib64/libc-2.15.so
   ...
   f2c6ff8c000-7f2c7078c000 rw-p 00000000 00:00 0    [stack:986]
   ...
   7fffb2c0d000-7fffb2c2e000 rw-p 00000000 00:00 0   [stack]
   7fffb2d48000-7fffb2d49000 r-xp 00000000 00:00 0   [vdso]

如果您知道共享对象的基本名称,则可以解析/ proc / self / maps的内容并找到完整路径。

要防止要更改的共享对象的名称,您还可以使用共享对象中的符号地址从/proc/self/maps中选择正确的行。