Заголовок совместимости ABI / перекрестная проверка библиотеки - PullRequest
3 голосов
/ 10 января 2012

Я искал инструмент перекрестной проверки ABI.Теперь я познакомился с некоторыми инструментами, предложенными в других вопросах, например, в следующих вопросах:

Как автоматически проверить двоичную совместимость?

Инструмент статического анализаобнаруживать разрывы ABI в C ++

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

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

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

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

Ответы [ 2 ]

1 голос
/ 13 июля 2013

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

1 голос
/ 10 января 2012

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

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

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

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

...