
Bibliothèque pour dérouler les piles d'appels du processeur, prenant en charge plusieurs architectures et systèmes d'exploitation, avec des instructions de construction et de tests de régression.
-- mode: Outline --
Ceci est la version 1.0 de la bibliothèque unwind. Cette bibliothèque prend en charge plusieurs combinaisons architecture/système d'exploitation :
Linux/x86-64 : Fonctionne bien. Linux/x86 : Fonctionne bien. Linux/ARM : Fonctionne bien. Linux/IA-64 : Entièrement testé et pris en charge. Linux/PARISC : Fonctionne bien, mais la bibliothèque C manque d'informations unwind. HP-UX/IA-64 : Fonctionne en grande partie mais présente des limitations sérieuses connues. Linux/AArch64 : Nouvellement ajouté. Linux/PPC64 : Nouvellement ajouté. Linux/SuperH : Nouvellement ajouté. FreeBSD/i386 : Nouvellement ajouté. FreeBSD/x86-64 : Nouvellement ajouté (l'architecture FreeBSD est connue sous le nom d'amd64).
En général, cette bibliothèque peut être compilée et installée avec les commandes suivantes :
$ autoreconf -i # Nécessaire uniquement pour la compilation depuis git. Dépend de libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
où PREFIX est le préfixe d'installation. Par défaut, un préfixe de /usr/local est utilisé, de sorte que libunwind.a est installé dans /usr/local/lib et unwind.h dans /usr/local/include. Pour les tests, vous pouvez utiliser un préfixe de /usr/local à la place.
** Version 8 et ultérieures
À partir de la version 8, le nom préféré pour le compilateur Intel IA-64 est "icc" (le même nom que sur x86). Ainsi, la ligne de configuration devrait ressembler à ceci :
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
Pour l'instant, libunwind doit être compilé avec GCC sur HP-UX.
libunwind doit être configuré et installé sur HP-UX comme ceci :
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
Attention : Le déroulement (unwinding) des binaires 32 bits (ILP32) n'est pas pris en charge pour le moment.
** Solution de contournement pour les anciennes versions de GCC
GCC v3.0 et GCC v3.2 sont livrés avec une version défectueuse de sys/types.h. La solution de contournement consiste à exécuter les commandes suivantes avant de lancer "configure" :
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 ou version ultérieure a été corrigé et ne nécessite pas cette solution de contournement.
Pour compiler pour power64, vous devez utiliser :
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Si votre processeur prend en charge les registres altivec : $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Pour vérifier si votre processeur prend en charge les registres vectoriels (altivec) : cat /proc/cpuinfo | grep altivec et devrait afficher quelque chose comme : cpu : PPC970, altivec supported
Si libunwind ne semble pas fonctionner (échec du backtracing), essayez de le compiler avec -O0, sans optimisations. Il existe certains problèmes de compilateur selon la version de votre gcc.
Les instructions générales de compilation s'appliquent. Pour compiler et exécuter plusieurs tests, vous avez besoin de la bibliothèque libexecinfo disponible dans les ports en tant que devel/libexecinfo.
Le développement du port a été effectué sur FreeBSD 8.0-STABLE. La bibliothèque a été compilée avec le compilateur système qui est une version modifiée de gcc 4.2.1, ainsi qu'avec gcc 4.4.3.
Après avoir compilé la bibliothèque, vous pouvez exécuter une série de tests de régression avec :
$ make check
** Résultats attendus sur IA-64 Linux
Sauf si vous disposez d'une bibliothèque C et d'un compilateur très récents, il est actuellement attendu que les tests suivants échouent sur IA-64 Linux :
Gtest-init (devrait réussir à partir de glibc-2.3.x/gcc-3.4)
Ltest-init (devrait réussir à partir de glibc-2.3.x/gcc-3.4)
test-ptrace (devrait réussir à partir de glibc-2.3.x/gcc-3.4)
run-ia64-test-dyn1 (devrait réussir à partir de glibc-2.3.x)
Cela ne signifie pas que libunwind ne peut pas être utilisé avec des compilateurs ou bibliothèques C plus anciens, cela signifie simplement que pour certains cas particuliers, le déroulement (unwinding) échouera. Comme ce sont des cas particuliers, il est peu probable que les applications les déclenchent.
Remarque : Si vous obtenez beaucoup d'erreurs dans Gia64-test-nat et Lia64-test-nat, c'est presque certainement le signe d'un assembleur ancien. L'assembleur GNU avait l'habitude de coder incorrectement les décalages relatifs au pointeur de pile précédent. Ce bug a été corrigé le 21-Sep-2004, donc tout assembleur ultérieur fonctionnera correctement.
** Résultats attendus sur x86 Linux
Les tests suivants devraient échouer sur x86 Linux :
Gtest-resume-sig (ne parvient pas à obtenir SIGUSR2)
Ltest-resume-sig (de même)
Gtest-dyn1 (aucune prise en charge des informations de déroulement dynamique pour le moment)
Ltest-dyn1 (aucune prise en charge des informations de déroulement dynamique pour le moment)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (pas encore de _Ux86_getcontext)
test-ptrace
** Résultats attendus sur x86-64 Linux
Les tests suivants devraient échouer sur x86-64 Linux :
Gtest-dyn1 (aucune prise en charge des informations de déroulement dynamique pour le moment)
Ltest-dyn1 (aucune prise en charge des informations de déroulement dynamique pour le moment)
Gtest-init (voir http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (de même)
test-async-sig (plante à cause de mauvaises informations de déroulement ?)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (pas encore de _Ux86_64_getcontext)
run-ptrace-mapper (??? à investiguer)
run-ptrace-misc (voir http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
et http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** Résultats attendus sur PARISC Linux
Attention : GCC v3.4 ou plus récent est nécessaire sur PA-RISC Linux. Les versions antérieures du compilateur ne parvenaient pas à générer l'en-tête de programme de gestion des exceptions (GNU_EH_FRAME) nécessaire au déroulement.
Les tests suivants devraient échouer sur x86-64 Linux :
Gtest-bt (backtrace tronqué à kill() en raison d'un manque d'informations de déroulement)
Ltest-bt (de même)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() est incorrect d'une certaine manière)
Ltest-resume-sig (de même)
Gtest-init (de même)
Ltest-init (de même)
Gtest-dyn1 (aucune prise en charge des informations de déroulement dynamique pour le moment)
Ltest-dyn1 (aucune prise en charge des informations de déroulement dynamique pour le moment)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (la chaîne d'outils ne prend pas encore en charge HIDDEN)
** Résultats attendus sur HP-UX
"make check" n'est actuellement pas pris en charge pour HP-UX. Vous pouvez essayer de l'exécuter, mais la plupart des tests échoueront (et certains pourraient ne pas se terminer). Les seuls programmes de test qui sont connus pour fonctionner à ce stade sont :
tests/bt
tests/Gperf-simple
tests/test-proc-info
tests/test-static-link
tests/Gtest-init
tests/Ltest-init
tests/Gtest-resume-sig
tests/Ltest-resume-sig
** Résultats attendus sur PPC64 Linux
"make check" devrait s'exécuter avec un maximum de 10 tests échoués sur 24.
Cette distribution inclut quelques tests de performance simples qui donnent une idée du coût de base de diverses opérations de libunwind. Après avoir compilé la bibliothèque, vous pouvez exécuter ces tests avec les commandes suivantes :
$ cd tests $ make perf
Veuillez adresser toutes les questions concernant cette bibliothèque à :
Vous pouvez le faire en envoyant un courrier à [email protected] avec le corps suivant :
subscribe libunwind-devel
ou vous pouvez vous abonner et gérer votre abonnement via l'interface web à l'adresse :
https://savannah.nongnu.org/mail/?group=libunwind