- Nek,
Hello tout le monde .
TL;DR: aller directement à la partie "problème" (mais vous aurez probablement besoin de tout lire anyway)
Contexte : je fais une petite expérience pour comprendre comment fonctionnent les builds static/dynamic linking. J’ai googlé un peu la chose et ça ne donne pas beaucoup de résultats… Mais peut être que je cherche au mauvais endroit.
Première étape : le programme à faire fonctionner. J’utilise sqlite3 pour illustrer.
#include <stdio.h>
#include <sqlite3.h>
int main() {
printf("Hello, World!\n");
printf("%s\n", sqlite3_libversion());
return 0;
}
Building : j’ai le Makefile suivant qui fonctionne.
build:
gcc -o test main.c -lsqlite3
Build statique : C’est là où tout se complique. J’ai tenté ce makefile mais ça ne fonctionne pas…
build.o:
gcc -c main.c
build.static: build.o
gcc main.o /usr/lib/x86_64-linux-gnu/libsqlite3.a /usr/lib/x86_64-linux-gnu/libpthread.a -o static-test
Détails sur pourquoi je fais ça : 1. J’utilise libsqlite3.a pour remplacer libsqlite3.so (logique) 2. Après avoir tenté la compilation une première fois, des erreurs avec pthread sont remontées, donc j’ai essayé de l’ajouter en binaire (ça a retiré des erreurs)
Le problème : J’ai toujours des erreurs. J’ai des erreurs qui me parlent de dlopen
qui - en plus de devoir être ajouté automatiquement (pourquoi ça n’est pas le cas ??) - pose un problème puisqu’il sert lui-même à inclure d’autres librairies dynamiques… J’ai l’impression que je suis dans un enfer de dépendances, comment faire pour gérer cela ?
$ make build.static
gcc -c main.c
gcc main.o /usr/lib/x86_64-linux-gnu/libsqlite3.a /usr/lib/x86_64-linux-gnu/libpthread.a -o static-test
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libsqlite3.a(sqlite3.o) : dans la fonction « fts5Bm25Function » :
(.text+0x2c914) : référence indéfinie vers « log »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libsqlite3.a(sqlite3.o) : dans la fonction « unixDlError » :
(.text+0x345e3) : référence indéfinie vers « dlerror »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libsqlite3.a(sqlite3.o) : dans la fonction « unixDlClose » :
(.text+0x8358) : référence indéfinie vers « dlclose »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libsqlite3.a(sqlite3.o) : dans la fonction « unixDlSym » :
(.text+0x836b) : référence indéfinie vers « dlsym »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libsqlite3.a(sqlite3.o) : dans la fonction « unixDlOpen » :
(.text+0x837d) : référence indéfinie vers « dlopen »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libpthread.a(pthread_create.o) : dans la fonction « allocate_stack » :
/build/glibc-ZN95T4/glibc-2.31/nptl/allocatestack.c:525 : référence indéfinie vers « _dl_stack_flags »
/usr/bin/ld : /build/glibc-ZN95T4/glibc-2.31/nptl/allocatestack.c:647 : référence indéfinie vers « _dl_stack_flags »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libpthread.a(elision-lock.o) : dans la fonction « do_set_elision_enable » :
/build/glibc-ZN95T4/glibc-2.31/nptl/../sysdeps/unix/sysv/linux/x86/elision-conf.c:66 : référence indéfinie vers « _dl_x86_cpu_features »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libpthread.a(nptl-init.o) : dans la fonction « __pthread_initialize_minimal_internal » :
/build/glibc-ZN95T4/glibc-2.31/nptl/nptl-init.c:335 : référence indéfinie vers « _dl_pagesize »
/usr/bin/ld : /build/glibc-ZN95T4/glibc-2.31/nptl/nptl-init.c:344 : référence indéfinie vers « _dl_pagesize »
/usr/bin/ld : /build/glibc-ZN95T4/glibc-2.31/nptl/nptl-init.c:360 : référence indéfinie vers « _dl_init_static_tls »
/usr/bin/ld : /build/glibc-ZN95T4/glibc-2.31/nptl/nptl-init.c:362 : référence indéfinie vers « _dl_wait_lookup_done »
/usr/bin/ld : /usr/lib/x86_64-linux-gnu/libpthread.a(nptl-init.o) : dans la fonction « __pthread_get_minstack » :
/build/glibc-ZN95T4/glibc-2.31/nptl/nptl-init.c:393 : référence indéfinie vers « _dl_pagesize »
collect2: error: ld returned 1 exit status
make: *** [Makefile:8 : build.static] Erreur 1