GNU/Linux >> Belajar Linux >  >> Linux

memuat pustaka statis secara dinamis?

A .a adalah arsip yang berisi satu atau lebih objek .o elf. Readelf dan objdump tidak akan menguraikannya. Anda harus menggunakan ar untuk mengekstrak file .o dari arsip. Penting untuk disadari bahwa jika Anda bersedia meluangkan waktu untuk menulis dan men-debug varian load_elf() yang dapat menggabungkan satu atau lebih pustaka statis dalam HAL, Anda dapat memuatnya secara dinamis dan memberi klien cara untuk mengintrospeksi entri panggilan mereka poin. Ini tidak standar, dan saya sudah bisa merasakan sastrawan berkedut seperti The Walking Jed. Namun, ELF berisi informasi yang cukup untuk menjatuhkan perpustakaan ke lingkungan runtime dan memberikan fungsi klien yang dikodekan dengan benar cara untuk menemukan antarmuka ke fungsi yang disediakan, dan memanggilnya. Ini bukan ilmu roket. Itu sangat membosankan. Konsep penting di sini adalah bahwa pengembang yang menyediakan arsip .a dan suite penyertaan dengan gagasan bahwa mereka membatasi penggunaan perpustakaan Anda, hanya mengganggu. Ini bukan halangan serius untuk menggunakan perpustakaan, atau menemukan cara kerjanya.


Pustaka statis kurang lebih hanyalah kumpulan file objek. Jika Anda ingin menggunakan perpustakaan statis dalam suatu program, Anda harus menautkan yang dapat dieksekusi dengannya. Eksekusi kemudian akan berisi pustaka statis (atau bagian yang Anda gunakan).

Jika Anda ingin memuat pustaka statis saat runtime menggunakan dlopen , Anda harus terlebih dahulu membuat pustaka dinamis libfoo.so mengandungnya.


Membuka .a file menggunakan dlopen tidak tidak berfungsi (diuji pada Ubuntu 10.04). Dengan contoh program berikut:

#include <dlfcn.h>
#include <stdio.h>

int main()
{
  void *lib_handle = dlopen("/usr/lib/libz.a",RTLD_LAZY);
  printf("dlopen error=%s\n",dlerror());

  printf("lib_handle=%p\n",lib_handle);
}

Saya mendapatkan:

dlopen error=/usr/lib/libz.a: invalid ELF header
lib_handle=(nil)

sedangkan saat menggunakan /usr/lib/libz.so sebagai gantinya, saya mendapatkan:

dlopen error=(null)
lib_handle=0x19d6030

jadi kode yang sama berfungsi untuk objek bersama.


Linux
  1. Tautan statis Linux sudah mati?

  2. Perbedaan antara objek bersama (.so), pustaka statis (.a), dan DLL (.so)?

  3. Gunakan perpustakaan C di Swift di Linux

  1. Cara Memasang Pustaka Ncurses Di Linux

  2. Memuat Pustaka Bersama Dan Penggunaan Ram?

  3. Apa itu file .so?

  1. Membuat Biner Statis?

  2. ld tidak dapat menemukan perpustakaan yang ada

  3. Apa trik LD_PRELOAD?