
Biblioteca multiarquitetura para desenrolar (unwinding) pilhas de chamadas de programas, possibilitando depuração de baixo nível, análise de falhas e pesquisa de segurança em sistemas Linux, FreeBSD e HP-UX.
-- mode: Outline --
Esta é a versão 1.0 da biblioteca unwind. Esta biblioteca suporta várias combinações de arquitetura/sistema operacional:
Linux/x86-64: Funciona bem. Linux/x86: Funciona bem. Linux/ARM: Funciona bem. Linux/IA-64: Totalmente testada e suportada. Linux/PARISC: Funciona bem, mas a biblioteca C carece de informações unwind. HP-UX/IA-64: Funciona na maior parte, mas sabe-se que tem algumas limitações sérias. Linux/AArch64: Adicionada recentemente. Linux/PPC64: Adicionada recentemente. Linux/SuperH: Adicionada recentemente. FreeBSD/i386: Adicionada recentemente. FreeBSD/x86-64: Adicionada recentemente (a arquitetura FreeBSD é conhecida como amd64).
Em geral, esta biblioteca pode ser compilada e instalada com os seguintes comandos:
$ autoreconf -i # Necessário apenas para compilar a partir do git. Depende do libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
onde PREFIX é o prefixo de instalação. Por padrão, um prefixo de /usr/local é usado, de modo que libunwind.a é instalado em /usr/local/lib e unwind.h é instalado em /usr/local/include. Para testes, você pode querer usar um prefixo de /usr/local em seu lugar.
** Versão 8 e posteriores
A partir da versão 8, o nome preferido para o compilador Intel IA-64 é "icc" (mesmo nome que no x86). Assim, a linha de configure deve ser assim:
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
Por enquanto, o libunwind deve ser compilado com GCC no HP-UX.
O libunwind deve ser configurado e instalado no HP-UX assim:
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
Aviso: O desenrolamento de binários de 32 bits (ILP32) não é suportado no momento.
** Solução alternativa para versões antigas do GCC
GCC v3.0 e GCC v3.2 vêm com uma versão ruim de sys/types.h. A solução alternativa é executar os seguintes comandos antes de executar "configure":
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
GCC v3.3.2 ou posterior foram corrigidos e não requerem esta solução alternativa.
Para compilar para power64 você deve usar:
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
Se o seu power suporta registradores altivec: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
Para verificar se o seu processador tem suporte para registradores vetoriais (altivec): cat /proc/cpuinfo | grep altivec e deve ter algo assim: cpu : PPC970, altivec supported
Se o libunwind parece não funcionar (o backtracing falha), tente compilá-lo com -O0, sem otimizações. Existem alguns problemas de compilador dependendo da versão do seu gcc.
As instruções gerais de compilação se aplicam. Para compilar e executar vários testes, você precisa da biblioteca libexecinfo disponível nos ports como devel/libexecinfo.
O desenvolvimento do port foi feito no FreeBSD 8.0-STABLE. A biblioteca foi compilada com o compilador do sistema que é uma versão modificada do gcc 4.2.1, assim como o gcc 4.4.3.
Após compilar a biblioteca, você pode executar um conjunto de testes de regressão com:
$ make check
** Resultados esperados no IA-64 Linux
A menos que você tenha uma biblioteca C e um compilador muito recentes instalados, é esperado atualmente que os seguintes testes falhem no IA-64 Linux:
Gtest-init (deve passar a partir de glibc-2.3.x/gcc-3.4)
Ltest-init (deve passar a partir de glibc-2.3.x/gcc-3.4)
test-ptrace (deve passar a partir de glibc-2.3.x/gcc-3.4)
run-ia64-test-dyn1 (deve passar a partir de glibc-2.3.x)
Isso não significa que o libunwind não possa ser usado com compiladores mais antigos ou bibliotecas C, significa apenas que para certos casos extremos, o desenrolamento falhará. Como são casos extremos, é improvável que as aplicações os acionem.
Nota: Se você obtiver muitos erros em Gia64-test-nat e Lia64-test-nat, é quase certamente um sinal de um montador antigo. O montador GNU costumava codificar deslocamentos relativos ao ponteiro de pilha anterior incorretamente. Este bug foi corrigido em 21-Set-2004, portanto, qualquer montador posterior estará ok.
** Resultados esperados no x86 Linux
Os seguintes testes devem falhar no x86 Linux:
Gtest-resume-sig (falha ao obter SIGUSR2)
Ltest-resume-sig (da mesma forma)
Gtest-dyn1 (sem suporte a informações unwind dinâmicas ainda)
Ltest-dyn1 (sem suporte a informações unwind dinâmicas ainda)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (_Ux86_getcontext ainda não existe)
test-ptrace
** Resultados esperados no x86-64 Linux
Os seguintes testes devem falhar no x86-64 Linux:
Gtest-dyn1 (sem suporte a informações unwind dinâmicas ainda)
Ltest-dyn1 (sem suporte a informações unwind dinâmicas ainda)
Gtest-init (veja http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (da mesma forma)
test-async-sig (quebra devido a informações unwind ruins?)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (_Ux86_64_getcontext ainda não existe)
run-ptrace-mapper (??? investigar)
run-ptrace-misc (veja http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
e http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** Resultados esperados no PARISC Linux
Aviso: GCC v3.4 ou mais novo é necessário no PA-RISC Linux. Versões anteriores do compilador falharam em gerar o cabeçalho de programa de tratamento de exceções (GNU_EH_FRAME) necessário para o desenrolamento.
Os seguintes testes devem falhar no x86-64 Linux:
Gtest-bt (backtrace truncado em kill() devido à falta de informações unwind)
Ltest-bt (da mesma forma)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() está errado de alguma forma)
Ltest-resume-sig (da mesma forma)
Gtest-init (da mesma forma)
Ltest-init (da mesma forma)
Gtest-dyn1 (sem suporte a informações unwind dinâmicas ainda)
Ltest-dyn1 (sem suporte a informações unwind dinâmicas ainda)
test-setjmp (longjmp() ainda não implementado)
run-check-namespace (a cadeia de ferramentas não suporta HIDDEN ainda)
** Resultados esperados no HP-UX
"make check" atualmente não é suportado para HP-UX. Você pode tentar executá-lo, mas a maioria dos testes falhará (e alguns podem não terminar). Os únicos programas de teste que se sabe funcionarem neste momento são:
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
** Resultados esperados no PPC64 Linux
"make check" deve ser executado com não mais que 10 de 24 testes falhando.
Esta distribuição inclui alguns testes de desempenho simples que dão uma ideia do custo básico de várias operações do libunwind. Após compilar a biblioteca, você pode executar estes testes com os seguintes comandos:
$ cd tests $ make perf
Por favor, direcione todas as perguntas sobre esta biblioteca para:
Você pode fazer isso enviando um e-mail para [email protected] com um corpo de:
subscribe libunwind-devel
ou você pode se inscrever e gerenciar sua inscrição através da interface web em:
https://savannah.nongnu.org/mail/?group=libunwind