.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.