it-swarm-pt.tech

Como prefixo um diretório do caminho da biblioteca ao carregar um arquivo principal no gdb no Linux

Eu tenho um arquivo principal gerado em um sistema remoto ao qual não tenho acesso direto. Também tenho cópias locais dos arquivos da biblioteca do sistema remoto e o arquivo executável do programa que está travando.

Gostaria de analisar esse dump principal em gdb.

Por exemplo:

gdb path/to/executable path/to/corefile

Minhas bibliotecas estão no diretório atual.

No passado, eu vi depuradores implementarem isso fornecendo a opção "-p". ou "-p/=."; então minha pergunta é:

Como posso especificar que as bibliotecas sejam carregadas primeiro dos caminhos relativos ao meu diretório atual ao analisar um arquivo principal no gdb?

25
Mike Tunnicliffe

Inicie o gdb sem especificar o arquivo executável ou principal e digite os seguintes comandos:

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

Você precisará espelhar o caminho da sua biblioteca exatamente do sistema de destino. O item acima destina-se à depuração de destinos que não correspondem ao seu host, por isso é importante replicar a estrutura do sistema de arquivos raiz que contém suas bibliotecas.

Se você estiver depurando remotamente um servidor com a mesma arquitetura e versão Linux/glibc que o seu Host, poderá fazer o que fd sugeriu:

set solib-search-path <path>

Se você estiver tentando substituir algumas das bibliotecas, mas não todas, poderá copiar a estrutura de diretórios da biblioteca de destino em um local temporário e usar a solução solib-absolute-prefix Descrita acima.

41
Drew Frezell

Não tenho certeza se isso é possível no gdb, mas não sou especialista.

No entanto, posso comentar sobre o vinculador dinâmico Linux. A seguir, imprima o caminho de todas as bibliotecas compartilhadas resolvidas e as não resolvidas.

ldd path/to/executable

Precisamos saber como suas bibliotecas compartilhadas foram vinculadas ao seu executável. Para fazer isso, use o seguinte comando:

readelf -d path/to/executable | grep RPATH
  • Se o comando não imprimir nada, o vinculador dinâmico usará locais padrão mais a variável de ambiente LD_LIBRARY_PATH para encontrar as bibliotecas compartilhadas.

  • Se o comando imprimir algumas linhas, o vinculador dinâmico ignorará LD_LIBRARY_PATH e, em vez disso, usará os rpaths codificados.

    Se os rpaths listados forem absolutos, a única solução que conheço é copiar (ou vincular) suas bibliotecas para os locais listados.

    Se os rpaths listados forem relativos, eles conterão um $ Origin que será substituído no tempo de execução pelo caminho do executável. Mova o executável ou as bibliotecas para corresponder.

Para mais informações, você pode começar com:

man ld.so
4
bltxd

Encontrei este trecho em developer.Apple.com

set solib-search-path path

Se essa variável estiver configurada, path será uma lista de diretórios separados por dois pontos para procurar bibliotecas compartilhadas. solib-search-path' is used after solib-absolute-prefix 'falha ao localizar a biblioteca ou se o caminho para a biblioteca for relativo em vez de absoluto. Se você deseja usar solib-search-path' instead of solib-absolute-prefix ', certifique-se de definir `solib-absolute-prefix' em um diretório inexistente para impedir que o GDB encontre as bibliotecas do seu host.

EDIT:

Eu não acho que o uso da configuração acima inclua os diretórios que adicionei, mas parece anexá-los; portanto, os arquivos ausentes no meu sistema atual são selecionados nos caminhos que adicionei. Eu acho que definir o prefixo solib-absolute-para algo falso e adicionar diretórios no caminho solib-search na ordem em que preciso pode ser uma solução completa.

3
Mike Tunnicliffe

Você também pode definir LD_PRELOAD para cada uma das bibliotecas ou LD_LIBRARY_PATH para o diretório atual ao chamar o gdb. Isso só causará problemas se o próprio gdb tentar usar qualquer uma das bibliotecas que você está pré-carregando.

2
Joseph Garvin

Uma observação importante:

se você estiver fazendo uma compilação cruzada e tentando depurar com o gdb, depois de fazer
file ECECUTABLE_NAME se você vê smth. gostar :

Using Host libthread_db library "/lib/libthread_db.so.1"

depois verifique se você possui libthread_db para o seu sistema de destino. Encontrei muitos problemas semelhantes na web. Esse problema não pode ser resolvido apenas usando "set solib-", você também deve criar o libthread_db usando seu compilador cruzado.

0
psihodelia