Общая библиотека ELF: перемещение смещено за пределы - PullRequest
3 голосов
/ 02 февраля 2010

Существует программный пакет 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

Меня это должно беспокоить?

1 Ответ

0 голосов
/ 11 февраля 2010

Быстрый ответ: «Это то, что меня должно беспокоить?» нет Нет .

Более длинный ответ: elflint проверяет не только стандарты ABI, но и некоторые соглашения ELF. Соглашения ABI и ELF меняются со временем: ABI расширяются и должны оставаться обратно совместимыми, а соглашения ELF со временем меняются (в основном, для получения новых функций). Как следствие, ожидания elflint должны быть синхронизированы с тем, что производит ваш ассемблер / компоновщик (в данном случае GNU binutils). Вы можете найти множество отчетов для elflint о новых расширениях ELF, представленных в GNU binutils, и о которых elflint ловит только позже. Таким образом, наиболее вероятно, что у вас есть версия elflint, которая слишком старая для вашего установленного binutils. Поскольку elflint используется не так часто, меня не удивит, что дистрибутив Linux не поддерживает синхронизацию этих двух файлов.

...