我有一个动态加载的插件(.so
文件)。在与.so
文件相同的文件夹中,我有一些图像。插件必须实现的一个功能是返回图像的路径。
如何从C ++(或C)中获取.so
的绝对路径?
我知道问题可以通过可执行文件轻松解决(图像与.so
位于同一文件夹中),但遗憾的是我无法访问其源代码。
答案 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
中选择正确的行。