Существует программный пакет elfutils
, который включает в себя программу под названием eu-elflint
для проверки двоичных файлов ELF (как и lint
для C - отсюда и название).
Просто для любопытства я проверил наши собственные разделяемые библиотеки с помощью этого инструмента, и он обнаружил много проблем, например ::
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
В качестве перекрестной проверки я создал очень простую общую библиотеку из исходного кода ниже
int foo(int a) {
return a + 1;
}
// gcc -shared -fPIC -o libfoo.so foo.c
И попробовал еще раз ...
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
Как видите, даже тривиальный пример также показывает много проблем.
Кстати: я на Ubuntu-Karmic-32bit с gcc v4.4.1
Кстати: ... то же самое происходит в Debian-Lenny-64bit с gcc v4.2.4
Меня это должно беспокоить?