Introspecção da interface de uma biblioteca compartilhada

3

Eu tenho um problema com uma biblioteca com a qual estou trabalhando pela primeira vez (é o Boost.Python, mas minha pergunta é muito mais geral do que neste caso).

Como consequência, preciso verificar qual é a interface da biblioteca que construí: para verificar se pelo menos construí tudo corretamente.

(Python está reclamando que ele não vê meu módulo, apesar de eu colocar o .so renomeado em .pyd em seu PYTHONPATH, então há algo errado em minha biblioteca)

Eu preciso conhecer todos os nomes das funções expostas da minha biblioteca .so e seu protótipo, se possível.

Existem comandos ou pacotes que eu possa instalar para alcançar algo assim?

    
por Stephane Rolland 20.01.2013 / 21:35

1 resposta

5

Você pode obter informações de um arquivo ELF (executável ou biblioteca) com readelf .

Parece que você está procurando os símbolos exportados, então use:

$ readelf --dyn-syms libyourthing.so

Para funções do tipo C, você só obterá nomes de funções, não tipos de argumentos ou valores de retorno. Para funções C ++, você obterá nomes desconfigurados - canalize a saída desse comando por meio de c++filt para obter nomes de funções e tipos de argumentos (ainda sem valores de retorno). (Globais também são exibidos na saída, com seus nomes e tamanho, mas não seu tipo.)

Outras ferramentas úteis são nm e objdump , que fornecem informações semelhantes.

Eu não tenho certeza se isso vai ajudar você. Você também deve tentar strace para ver se o python está olhando onde você pensa que está. Algo como:

$ strace -e trace=open python your_code_that_loads_your_lib.py

mostrará todas as open chamadas executadas pelo python - procure o nome da sua biblioteca lá (haverá um lote logado pelo acima, filtre-o). Cada chamada também mostra o código de retorno, então você pode ter uma ideia melhor sobre o que está acontecendo.

Ah, e certifique-se de que você não está tentando carregar uma biblioteca de 32 bits em um tempo de execução de python de 64 bits, ou vice-versa.

    
por 20.01.2013 / 22:02