
Bibliothèque C multi-architecture pour le déroulement de pile, la génération de backtrace et la gestion des exceptions, utilisée pour le débogage, le profilage et l'analyse binaire sur Linux, FreeBSD et HP-UX.
Ceci est la version 1.0 de la bibliothèque unwind. Cette bibliothèque supporte 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 supporté. Linux/PARISC : Fonctionne bien, mais la bibliothèque C manque d'informations unwind. HP-UX/IA-64 : Fonctionne en grande partie mais a 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 amd64).
En général, cette bibliothèque peut être construite et installée avec les commandes suivantes :
$ autoreconf -i # Nécessaire seulement pour la construction 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 IA-64 Intel est "icc" (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 construit 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"
Avertissement : Le déroulement de la pile (unwinding) des binaires 32 bits (ILP32) n'est pas supporté pour le moment.
** Solution de contournement pour les anciennes versions de GCC
GCC v3.0 et GCC v3.2 sont livrés avec une mauvaise version 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 ultérieur a été corrigé et ne nécessite pas cette solution de contournement.
Pour construire pour power64, vous devez utiliser :
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Si votre power 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 avoir quelque chose comme ceci : cpu : PPC970, altivec supported
Si libunwind semble ne pas fonctionner (le backtrace échoue), essayez de le compiler avec -O0, sans optimisations. Il y a certains problèmes de compilateur selon la version de votre gcc.
Les instructions générales de construction s'appliquent. Pour construire et exécuter plusieurs tests, vous avez besoin de la bibliothèque libexecinfo disponible dans les ports sous devel/libexecinfo.
Le développement du port a été effectué sur FreeBSD 8.0-STABLE. La bibliothèque a été construite 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 construit la bibliothèque, vous pouvez exécuter un ensemble de tests de régression avec :
$ make check
** Résultats attendus sur IA-64 Linux
Sauf si vous avez une bibliothèque C et 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 de la pile é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 un signe d'un assembleur ancien. L'assembleur GNU utilisait auparavant un encodage incorrect des décalages relatifs au pointeur de pile précédent. Ce bogue a été corrigé le 21-Sep-2004, donc tout assembleur plus récent sera correct.
** Résultats attendus sur x86 Linux
Les tests suivants sont attendus à échouer sur x86 Linux :
Gtest-resume-sig (échec d'obtention de SIGUSR2)
Ltest-resume-sig (de même)
Gtest-dyn1 (pas encore de support pour les informations dynamiques de déroulement)
Ltest-dyn1 (pas encore de support pour les informations dynamiques de déroulement)
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 sont attendus à échouer sur x86-64 Linux :
Gtest-dyn1 (pas encore de support pour les informations dynamiques de déroulement)
Ltest-dyn1 (pas encore de support pour les informations dynamiques de déroulement)
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 infos de déroulement ?)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (pas encore de _Ux86_64_getcontext)
run-ptrace-mapper (??? à étudier)
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
Avertissement : GCC v3.4 ou plus récent est nécessaire sur PA-RISC Linux. Les versions précédentes 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 sont attendus à échouer sur x86-64 Linux :
Gtest-bt (backtrace tronqué à kill() en raison du manque d'infos de déroulement)
Ltest-bt (de même)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() est incorrect d'une manière ou d'une autre)
Ltest-resume-sig (de même)
Gtest-init (de même)
Ltest-init (de même)
Gtest-dyn1 (pas encore de support pour les informations dynamiques de déroulement)
Ltest-dyn1 (pas encore de support pour les informations dynamiques de déroulement)
test-setjmp (longjmp() pas encore implémenté)
run-check-namespace (la chaîne d'outils ne supporte pas encore HIDDEN)
** Résultats attendus sur HP-UX
"make check" n'est actuellement pas supporté pour HP-UX. Vous pouvez essayer de l'exécuter, mais la plupart des tests échoueront (et certains peuvent ne pas se terminer). Les seuls programmes de test connus pour fonctionner à ce jour 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 pas plus 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 construit 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 mail à [email protected] avec un corps de message :
subscribe libunwind-devel
ou vous pouvez vous abonner et gérer votre abonnement via l'interface web à :
https://savannah.nongnu.org/mail/?group=libunwind