如何获取当前库路径

3
我有一个动态加载的插件(.so文件),与该文件在同一文件夹中还有一些图片。插件必须实现的一个函数是返回这些图片的路径。 如何在C++(或C)中从.so文件本身获取绝对路径? 我知道如果可执行文件能访问到源代码,这个问题可以很容易地解决(因为图片与.so文件在同一文件夹中),但不幸的是我不能访问它的源代码。

1
在Linux/glibc上,您可以使用dl_iterate_phdr来获取大部分与/proc/self/maps相同的信息,但无需解析任何内容。 - n. m.
1个回答

4

在Linux系统中,/proc/self/maps会列出当前加载的每个共享对象的完整路径。根据proc.5手册页面

/proc/[pid]/maps

A file containing the currently mapped memory regions and their access permissions. See mmap(2) for some further information about memory mappings.

...

The format of the file is:

   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选择正确的行。

1
不需要在自己的共享对象上使用 dlsym - n. m.
@n.m. 是的,dlsym() 可以工作,但你也可以直接获取某个东西的地址。我会更新的。早上太早了...;-) - Andrew Henle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接