2012-01-09 3 views
3

Я искал инструмент перекрестной проверки ABI. Сейчас я встречался с некоторыми из инструментов предлагается в других вопросах, например, в этих вопросах:Заголовок совместимости ABI/перекрестная проверка библиотеки

How to test binary compatibility automatically?

Static analysis tool to detect ABI breaks in C++

Теперь, это не совсем то, что я пытаюсь сделать - так как это отслеживать ABI изменения между версиями.

Мне было интересно, что данные исходных файлов проекта + файл заголовка библиотеки и файл .so библиотеки, а также версия компилятора (которая используется для компиляции как библиотеки, так и проекта), можно проверить, что вывод ABI соответствует скомпилированной библиотеке?

Таким образом, ситуация, к которой это применимо, заключается в том, что библиотека upstream отправляет libfoo.so и libfood.so. Где еда немного отличается от ABI (скажем, удваивается вместо float), но не так далеко, что она не будет компилироваться.

  • Возможно ли придумать тест (возможно, не пуленепробиваемый), в котором говорится, что скомпилированный исполняемый файл связан с правильным lib?
  • Есть ли инструменты, которые это делают?

ответ

1

Если вы предполагаете, что у вас есть только libfoo.so, закодированный в C (без наличия файлов заголовков, которые вы также должны иметь), нет способа узнать, например. сигнатура функций внутри, потому что таблица символов общего объекта не содержит никакой информации для ввода (например, ничего, кроме обычной мудрости, препятствует тому, чтобы библиотека содержала функцию malloc, которая добавляет два целых числа и возвращает их сумму, вместо того, чтобы делать обычную куча).

Значит, libfoo.so можно оскорблять. Тем не менее, обычно есть версии, связанные с символами в некоторых общих библиотеках (и вы можете запросить это программно через dlvsym, если вы используете dlopen -в библиотеку). Существует способ генерации версий.

Если библиотека чистая C++, то символы mangled, поэтому их кодировка содержит свою подпись.

Лучшая практика - иметь некоторые функции внутри вашей библиотеки, которые возвращают версию библиотеки. Посмотрите на glib version information функции для хорошего примера.

1

Кажется, что ABI compliance checker также поддерживает проверку приложения на предмет его воздействия на любые изменения между двумя библиотеками.

Смежные вопросы