Système de fichiers buildroot et compilation croisée: application liée de manière dynamic échoue mais ok statique. Comment lier contre uClibc

J’ai un système de fichiers créé par buildroot et j’essaie d’exécuter du code C sur le serveur lighttpd.

J’ai créé un module C simple qui n’imprime que quelques lignes de code HTML. Le code ressemble à ceci:

#include "stdio.h" int main(void) { printf( "Content-Type: text/plain\n\n" ); printf("testing C code\n"); return 0; } 

J’utilise un compilateur du référentiel Ubuntu pour le comstackr arm-linux-gnueabi-gcc -o test.cgi test.c Si je comstack avec l’ -static , tout se passera bien, et je pourrai voir le code HTML affiché. Mais en compilant sans le drapeau statique, l’exécution échoue de la manière suivante:

 # ./test.cgi -sh: ./first.cgi: not found 

Je me demande si la raison en est une bibliothèque de c, et je devrais lier contre l’uClibc qui a été compilé par buildroot. Dans mon dossier buildroot, output/host/usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib je peux voir les fichiers suivants:

 -rwxr-xr-x 1 jlumme jlumme 25444 Jan 26 17:13 ld-uClibc-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 21 Jan 26 17:12 ld-uClibc.so.0 -> ld-uClibc-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 13191 Jan 26 17:13 libcrypt-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 20 Jan 26 17:13 libcrypt.so.0 -> libcrypt-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 21 Jan 26 17:13 libc.so.0 -> libuClibc-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 13383 Jan 26 17:13 libdl-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 17 Jan 26 17:13 libdl.so.0 -> libdl-0.9.33.2.so -rw-r--r-- 1 jlumme jlumme 135 Jan 26 17:15 libgcc_s.so -rw-r--r-- 1 jlumme jlumme 180152 Jan 26 17:15 libgcc_s.so.1 -rwxr-xr-x 1 jlumme jlumme 64555 Jan 26 17:13 libm-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 16 Jan 26 17:13 libm.so.0 -> libm-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 4772 Jan 26 17:13 libnsl-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 18 Jan 26 17:13 libnsl.so.0 -> libnsl-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 79059 Jan 26 17:13 libpthread-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 22 Jan 26 17:13 libpthread.so.0 -> libpthread-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 4776 Jan 26 17:13 libresolv-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 21 Jan 26 17:13 libresolv.so.0 -> libresolv-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 13927 Jan 26 17:13 librt-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 17 Jan 26 17:13 librt.so.0 -> librt-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 284451 Jan 26 17:13 libuClibc-0.9.33.2.so -rwxr-xr-x 1 jlumme jlumme 4955 Jan 26 17:13 libutil-0.9.33.2.so lrwxrwxrwx 1 jlumme jlumme 19 Jan 26 17:13 libutil.so.0 -> libutil-0.9.33.2.so 

Est-ce que le fichier libuClibc-0.9.33.2.so que je cherche? Comment puis-je lier ma demande à celle?

Dans mon tableau cible, je peux le voir dans /usr/lib

 lrwxrwxrwx 1 root root 15 Jan 26 2013 libbz2.so -> libbz2.so.1.0.6 lrwxrwxrwx 1 root root 15 Jan 26 2013 libbz2.so.1 -> libbz2.so.1.0.6 lrwxrwxrwx 1 root root 15 Jan 26 2013 libbz2.so.1.0 -> libbz2.so.1.0.6 -rwxrwxr-x 1 root root 57924 Jan 26 2013 libbz2.so.1.0.6 lrwxrwxrwx 1 root root 16 Jan 26 2013 libelf.so -> libelf.so.0.8.12 lrwxrwxrwx 1 root root 16 Jan 26 2013 libelf.so.0 -> libelf.so.0.8.12 -rwxr-xr-x 1 root root 69924 Jan 26 2013 libelf.so.0.8.12 lrwxrwxrwx 1 root root 16 Jan 26 2013 libpcre.so -> libpcre.so.1.0.0 lrwxrwxrwx 1 root root 16 Jan 26 2013 libpcre.so.1 -> libpcre.so.1.0.0 -rwxr-xr-x 1 root root 88804 Jan 26 2013 libpcre.so.1.0.0 lrwxrwxrwx 1 root root 19 Jan 26 2013 libpcrecpp.so -> libpcrecpp.so.0.0.0 lrwxrwxrwx 1 root root 19 Jan 26 2013 libpcrecpp.so.0 -> libpcrecpp.so.0.0.0 -rwxr-xr-x 1 root root 27436 Jan 26 2013 libpcrecpp.so.0.0.0 lrwxrwxrwx 1 root root 21 Jan 26 2013 libpcreposix.so -> libpcreposix.so.0.0.0 lrwxrwxrwx 1 root root 21 Jan 26 2013 libpcreposix.so.0 -> libpcreposix.so.0.0.0 -rwxr-xr-x 1 root root 5576 Jan 26 2013 libpcreposix.so.0.0.0 lrwxrwxrwx 1 root root 19 Jan 26 2013 libsqlite3.so -> libsqlite3.so.0.8.6 lrwxrwxrwx 1 root root 19 Jan 26 2013 libsqlite3.so.0 -> libsqlite3.so.0.8.6 -rwxr-xr-x 1 root root 516472 Jan 26 2013 libsqlite3.so.0.8.6 lrwxrwxrwx 1 root root 19 Jan 26 2013 libstdc++.so -> libstdc++.so.6.0.14 lrwxrwxrwx 1 root root 19 Jan 26 2013 libstdc++.so.6 -> libstdc++.so.6.0.14 -rwxr-xr-x 1 root root 418936 Jan 26 2013 libstdc++.so.6.0.14 -rw-r--r-- 1 root root 2422 Jan 26 2013 libstdc++.so.6.0.14-gdb.py lrwxrwxrwx 1 root root 16 Jan 26 2013 libxml2.so -> libxml2.so.2.8.0 lrwxrwxrwx 1 root root 16 Jan 26 2013 libxml2.so.2 -> libxml2.so.2.8.0 -rwxr-xr-x 1 root root 1063556 Jan 26 2013 libxml2.so.2.8.0 drwxrwxr-x 2 root root 4096 Jan 26 2013 lighttpd -rw-r--r-- 1 root root 195 Jan 26 2013 xml2Conf.sh 

Pour construire votre application, vous devez utiliser le compilateur croisé généré par Buildroot, situé dans output/host/usr/bin/-gcc .

Ici, vous utilisez le compilateur croisé Ubuntu ARM, qui cible un système qui utilise la bibliothèque eglibc C. Mais le système généré avec Buildroot utilise la bibliothèque uClibc C. Par conséquent, il n’y a absolument aucune chance qu’un binary construit avec le compilateur croisé Ubuntu ARM s’exécute sur ce système généré par Buildroot.

Il suffit d’utiliser le compilateur croisé que Buildroot a généré pour vous.