Biblioteca compartilhada da ELF: deslocamento de realocação fora dos limites
-
25-09-2019 - |
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?
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.