GNU/Linux >> Belajar Linux >  >> Linux

jalur perpustakaan saat dimuat secara dinamis?

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 dan dli_saddr disetel ke NULL .

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.


Linux
  1. Kapan Menggunakan Nohup?

  2. Kapan Anda Menggunakan Brace Expansion?

  3. Cara Cepat Untuk Menyertakan Jalur Direktori Saat Memanggil Mv??

  1. Linux – Apa Yang Terjadi Saat Anda Rsync Tanpa Jalur Tujuan??

  2. memuat pustaka statis secara dinamis?

  3. Bagaimana cara menambahkan file .so ke java.library.path di Linux

  1. Apa itu file .so?

  2. Bagaimana cara menghapus path lengkap saat melakukan kompresi tar.gz?

  3. Bagaimana Anda bisa menetapkan jalur utama yang sewenang-wenang saat menambahkan file ke tar?