encontrando o símbolo indefinido

4

Estou tentando executar um programa cuja origem eu baixei e compilou. Quando tento executar o programa, continuo recebendo a mensagem:

unable to load undefined symbol _z15InvalidateImageSs

Estou tentando determinar por que estou recebendo esse erro. O programa é na verdade uma biblioteca que é carregada por outro programa. Meu programa compila para um arquivo .so.

eu corri:

$ nm myprog.so > nm.txt

o símbolo aparece no arquivo, mas não tem um endereço associado a ele.

  1. Eu procurei na árvore de origem pelo símbolo usando:

$ find . -type f | xargs fgrep -I '_zinvalidateimagess' | grep -v 'Binary

Não tenho resultados. 2. Eu procurei em todas as bibliotecas de carga padrão pelo símbolo:

$ scanelf -l -s _zInvalidateImageSs | grep -I '_zinvalidateImageSs'

sem resultados novamente.

Então minha pergunta é: Se o símbolo nunca é referenciado em qualquer lugar na árvore de origem, por que é um problema no arquivo .so? Como faço para descobrir de onde este símbolo deve vir?

    
por dnraikes 31.03.2015 / 09:53

1 resposta

1

A fonte da biblioteca pode declarar um símbolo sem definir , fazendo algo parecido com isto

extern InvalidateImage(const char *);

e depois usá-lo

const char *foo = InvalidateImage(bar);

Como é uma biblioteca, você não perceberia isso até tentar executar o programa que usa este símbolo. O lugar para procurar pelo símbolo é onde você fez o download da fonte da biblioteca: provavelmente o desenvolvedor dessa biblioteca fornece diretamente a fonte relacionada ou algumas pistas sobre de onde a obtêm.

Por que vale a pena, eu uso scripts ( exports e externs ) para verificar se há símbolos ausentes nos programas que eu mantenho.

Leitura adicional:

por 17.08.2016 / 10:46