Существует программный пакет elfutils
, который включает в себя программу под названием eu-elflint
для проверки двоичных файлов ELF (так же, как lint
для C - отсюда и название).Общая библиотека ELF: смещение смещения за пределами
Просто из любопытства я проверил наши собственные общие библиотеки с помощью этого инструмента, и он нашел много вопросов, например:
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
Как вам может видеть, что даже тривиальный пример также показывает много проблем.
BTW: Я нахожусь на Ubuntu-кармического-32bit с GCC v4.4.1
КСТАТИ: ... То же самое происходит на Debian-Ленни-64bit с GCC v4.2.4
ли это то, что я следует беспокоиться?