FAQ création de paquetage pour OpenWRT

Le but de cette FAQ est de fournir une réponse aux problèmes les plus courants que vous pourriez rencontrer lors de la compilation d’un paquetage.

Cross-compiler un paquetage est différent du port de celui-ci, et dans la mesure ou vous ne pouvez pas le compiler directement sur l’architecture en question vous serez parfois dans l’impossibilité de vous en servir.

Cross-compiler une paquetage ne nécessite pas de connaissances particulières en C/C++, ca peut être nécessaire pour des logiciels à problèmes. Si vous maîtrisez les outils comme patch et diff, vous pourrez vous attaquer à fournir des patchs pour le noyau.


J’obtiens une erreur de type : /usr/lib/libxml2.so : could not read symbols : Invalid operation collect2 : ld returned 1 exit status

Le cross-linker essaye de linker le programme par rapport à une libraire présente sur votre système mais compilée pour votre architecture : x86, ppc, hppa, mips ... et qui ne correspond pas à l’architecture cross compilée.

Assurez-vous que vous avez bien installé la librairie pour la cross-compilation dans build_mipsel/staging_dir/usr/lib/ (variable $(STAGING_DIR))

et dans le pire des cas, editez le Makefile et incluez la librairie lors du linkage :


-I $(STAGING_DIR)/usr/lib

J’obtiens une erreur de type : checking size of void *... configure : error : can not run test program while cross compiling

Le programme configure ne peut pas vérifier la taille de void. Editez le fichier configure repérez le message et regardez s’il n’y a pas un test de type :


if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set";

S’il y en a un alors, il convient de donner une valeur à la variable ac_cv_sizeof_void_p et de la donner juste avant le lancement du configure :


[...]
$(TARGET_CONFIGURE_OPTS) \
               CFLAGS="$(TARGET_CFLAGS)" \
               ac_cv_sizeof_void_p=4 \                ./configure \

Ainsi vous devriez voir apparaître que la valeur est mise en cache cached lors du configure.

S’il n’y a pas de test, et que vous pensez que ce test n’est pas très important, vous pouvez soit lui donner une valeur toujours négative, ou l’activer par défaut.

Il s’agit dans ce cas de supprimer le test. Vous aurez un message d’erreur, mais le programme configure continuera.


J’obtiens une erreur : In file included from rva.cpp:21 : rva.h:43:23 : stropts.h : No such file or directory make[3] : *** [rva.o] Erreur 1

Pensez à inclure les bons fichiers d’entête pour que votre programme se compile bien.

Par exemple il suffira de faire dans notre cas :


cp /usr/include/stropts.h build_mipsel/staging_dir/usr/include

Relancez la compilation et en principe elle se termine correctement.


J’ai installé mon programme sur le WRT et je ne peux pas l’executer, j’ai une erreur de type : parse error ""

Vous n’avez pas cross-compilé votre programme ! le compilateur utilisé était celui de votre architecture et non pas celle du WRT !

Vérifiez toujours que vous obtenez ce message sur un executable pour WRT :


file programme
programme: ELF 32-bit LSB MIPS-II executable, MIPS, version 1 (SYSV), dynamicallylinked (uses shared libs), corrupted section header size

J’obtiens une erreur de type : ./dftables : ./dftables : cannot execute binary file

Cette erreur intervient lorsque vous essaye de cross-compiler un logiciel qui nécessite un utilitaire pour générer d’autres fichiers sources.

Procédez comme suit dans ce cas. Décompressez et configurez votre logiciel pour votre architecture (la machine qui cross-compile), puis relancez le processus de cross-compilation, et copiez le fichier incriminé dans le répertoire adéquat, le processus de cross-compilation reprend immédiatement ensuite, et il n’influe pas sur le programme cross-compilé.


J’obtiens l’erreur suivante lors du linkage : : undefined reference to `rpl_malloc’

C’est une variable mal configurée qui provoque cette erreur. Vérifiez que votre script configure contient le test similaire :


echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6
if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then
 echo $ECHO_N "(cached) $ECHO_C" >&6

Si c’est le cas, invoquez le script configure ainsi :


./configure \
ac_cv_func_malloc_0_nonnull=yes \
ac_cv_func_realloc_0_nonnull=yes \
[...]

Cette FAQ est assez sommaire pour le moment, soumettez moi tous vos problèmes qui ne rentrent pas dans cette catégorie.