GNU/Linux >> Znalost Linux >  >> Linux

dynamicky načítat statickou knihovnu?

.a je archiv obsahující jeden nebo více objektů .o elf. Readelf a objdump je nebudou analyzovat. K extrahování souborů .o z archivu musíte použít ar. Je důležité si uvědomit, že pokud jste ochotni strávit čas psaním a laděním varianty load_elf(), která dokáže zabalit jednu nebo více statických knihoven do HAL, můžete je načíst dynamicky a poskytnout klientům způsob, jak si prohlédnout jejich záznam hovoru. body. To je nestandardní a už cítím, jak ti literáti cukají jako The Walking Jed. ELF však obsahuje dostatek informací k tomu, aby knihovnu přenesla do běhového prostředí a poskytla správně kódovaným klientským funkcím způsob, jak objevit rozhraní k poskytovaným funkcím a volat je. Tohle není žádná raketová věda. Je to prostě zdlouhavé. Důležitým konceptem je, že vývojář, který poskytuje archiv .a a sadu include s myšlenkou, že omezují vaše používání knihoven, je jen otravný. Není to vážná překážka při používání knihovny nebo zjišťování, jak funguje.


Statická knihovna je víceméně jen sbírka objektových souborů. Pokud chcete v programu použít statickou knihovnu, musíte s ní propojit spustitelný soubor. Spustitelný soubor pak bude obsahovat statickou knihovnu (nebo části, které jste použili).

Pokud chcete načíst statickou knihovnu za běhu pomocí dlopen , budete muset nejprve vytvořit dynamickou knihovnu libfoo.so obsahující jej.


Otevření .a soubor pomocí dlopen ne práce (testováno na Ubuntu 10.04). S následujícím příkladem programu:

#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);
}

Chápu:

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

při použití /usr/lib/libz.so místo toho dostávám:

dlopen error=(null)
lib_handle=0x19d6030

takže stejný kód funguje pro sdílený objekt.


Linux
  1. Jak nainstalovat knihovnu Ncurses v Linuxu

  2. Načítání sdílených knihoven a využití RAM?

  3. Vytvořit statickou binární hodnotu?

  1. Jaký je trik LD_PRELOAD?

  2. Převést statickou knihovnu na sdílenou?

  3. Statický odkaz funkce sdílené knihovny v gcc

  1. cesta ke knihovně při dynamickém načítání?

  2. Jak zahrnout statickou knihovnu do makefile

  3. Jak může sdílená knihovna (.so) volat funkci, která je implementována v jejím načítacím programu?