Mircea Ispas
Mircea Ispas

Reputation: 20800

How to get current library path

I have a plugin (.so file), that is dynamically loaded. In the same folder with the .so file I have some images. One function the plugin must implement is to return the paths of the images.

How may I get the absolute path of the .so from itself in C++ (or C)?

I know the issue can be solved easily from the executable (the images are in the same folder as the .so), but unfortunately I don't have access to its source code.

Upvotes: 3

Views: 2745

Answers (1)

Andrew Henle
Andrew Henle

Reputation: 1

On Linux, /proc/self/maps will list the full path of every shared object currently loaded. Per the proc.5 man page:

/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]

If you know the base name of your shared object, you can parse the contents of /proc/self/maps and find the full path.

To guard against the name of the shared object being changed, you can also use the address of a symbol in your shared object to select the proper line from /proc/self/maps.

Upvotes: 4

Related Questions