Pergunta

Existe um pacote de software elfutils que inclui um programa chamado eu-elflint para verificar binários de elfo (exatamente como lint para c - daí o nome).

Apenas por curiosidade, verifiquei nossas próprias bibliotecas compartilhadas com esta ferramenta e encontrou muitos problemas, por exemplo:

eu-elflint libUtils.so

section [ 2] '.dynsym': _DYNAMIC symbol size 0 does not match dynamic segment size 248
section [ 2] '.dynsym': _GLOBAL_OFFSET_TABLE_ symbol size 0 does not match .got.plt     section size 3076
section [ 8] '.rel.plt': relocation 0: offset out of bounds
section [ 8] '.rel.plt': relocation 1: offset out of bounds
...
section [ 8] '.rel.plt': relocation 765: offset out of bounds

Como verificação cruzada, construí uma biblioteca compartilhada muito trivial a partir do código -fonte abaixo

int foo(int a) {
   return a + 1;
}

// gcc -shared -fPIC -o libfoo.so foo.c

E tentei novamente ...

eu-elflint libfoo.so

section [ 9] '.rel.plt': relocation 0: offset out of bounds
section [ 9] '.rel.plt': relocation 1: offset out of bounds
section [23] '.comment' has wrong flags: expected none, is MERGE|STRINGS
section [25] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol size 0 does not match .got.plt section size 20
section [25] '.symtab': _DYNAMIC symbol size 0 does not match dynamic segment size 200

Como você pode ver, até o exemplo trivial também mostra muitos problemas.

BTW: Estou no Ubuntu-karmic-32bit com o GCC v4.4.1

BTW: ... o mesmo acontece no Debian-Lenny-64bit com o GCC v4.2.4

Isso é algo com o qual devo me preocupar?

Foi útil?

Solução

Resposta rápida: "Isso é algo com o qual devo me preocupar?" Não.

Resposta mais longa: o Elflint verifica não apenas os padrões da ABI, mas também algumas convenções de elfo. As convenções ABIS e ELF mudam com o tempo: os ABIS são estendidos e precisam permanecer compatíveis com versões anteriores, e as convenções de ELF evoluem com o tempo (para obter novos recursos, principalmente). Como conseqüência, as expectativas do Elflint devem ser mantidas em sincronia com o que seu assembler/ligante (os binutils GNU neste caso) produzem. Você pode encontrar muitos relatórios para a Elflint sobre novas extensões de ELF introduzidas no GNU Binutils, e para as quais o Elflint só captura mais tarde. Portanto, é mais provável que você tenha uma versão do Elflint que seja muito antiga para os binutils instalados. Como o Elflint não é tão usado, não me surpreenderia que uma distro Linux não mantenha esses dois sincronizados tão bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top