ELF libreria condivisa: delocalizzazione compensato fuori dai limiti
-
25-09-2019 - |
Domanda
C'è un elfutils
pacchetto software che include un programma chiamato eu-elflint
per la verifica binari ELF (proprio come lint
per C - da qui il nome).
Solo per curiosità ho controllato le nostre librerie condivise con questo strumento e ha trovato un sacco di problemi, per esempio:.
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
Come un controllo incrociato ho costruire una libreria condivisa molto banale dal codice sorgente sotto
int foo(int a) {
return a + 1;
}
// gcc -shared -fPIC -o libfoo.so foo.c
E ancora provato ...
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
Come si può vedere anche il banale esempio mostra anche un sacco di problemi.
A proposito: io sono su Ubuntu Karmic--32bit con gcc v4.4.1
A proposito: ... lo stesso avviene su Debian-Lenny-64bit con gcc v4.2.4
E 'questo qualcosa che dovrei essere preoccupato?
Soluzione
Risposta rapida: "E 'questo qualcosa che dovrei essere preoccupato?" No .
Più rispondere: controlli elflint non solo gli standard ABI, ma anche alcune convenzioni ELF. Entrambe le convenzioni Abis e ELF cambiare nel corso del tempo: ABI sono estese, e deve rimanere compatibile, e le convenzioni ELF si evolverà nel tempo (per ottenere nuove funzionalità, soprattutto). Di conseguenza, le aspettative di elflint devono essere tenuti in sincronia con prodotti che cosa il vostro assemblatore / linker (binutils GNU in questo caso). È possibile trovare un sacco di report per elflint su nuove estensioni ELF introdotte nel binutils GNU, e per i quali le catture elflint solo più tardi. Così, è molto probabile che si dispone di una versione di elflint che è troppo vecchio per le binutils installati. Come elflint non è tanto utilizzato, non mi sorprenderebbe che una distro linux non tenere quei due in sincronia così bene.