Penghubung dinamis sebenarnya mencari beberapa tempat untuk menemukan setiap perpustakaan dinamis. Ini termasuk (dari man ld.so):
- Jalur yang diberikan oleh variabel lingkungan
LD_LIBRARY_PATH - Jalur yang dimasukkan ke dalam biner memuat pustaka di bawah
DT_RUNPATHmasuk - Berkas tembolok /etc/ld.so.cache
- /lib dan /usr/lib
Jika Anda ingin mendapatkan jalur untuk pustaka bersama tertentu, saya akan merekomendasikan dladdr fungsi. Dari halaman manual:
Fungsi dladdr() mengambil pointer fungsi dan mencoba untuk menyelesaikan nama dan file di mana ia berada. Informasi disimpan di
Dl_infostruktur:typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at which shared object is loaded */ const char *dli_sname; /* Name of nearest symbol with address lower than addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */ } Dl_info;Jika tidak ada simbol yang cocok dengan addr yang ditemukan, maka
dli_snamedandli_saddrdisetel keNULL.
dladdr()mengembalikan 0 pada kesalahan, dan bukan nol pada kesuksesan.
Jadi Anda cukup memberinya penunjuk fungsi, dan itu akan memberi Anda nama file yang memasoknya dan banyak informasi lainnya. Misalnya, Anda dapat meminta konstruktor di pustaka memanggil ini sendiri untuk mengetahui jalur lengkap pustaka:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
__attribute__((constructor))
void on_load(void) {
Dl_info dl_info;
dladdr((void *)on_load, &dl_info);
fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}
Fungsi ini juga berfungsi di OS X dengan semantik yang sama.