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_RUNPATH
masuk - 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_info
struktur: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_sname
dandli_saddr
disetel 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.