dlopen не работает с инструментами покрытия кода (lcov/gcov)

Структура всего приложения:

  1. В общей библиотеке говорят - low_level.so.
  2. Статическая библиотека говорит - high_level.a. Эта статическая библиотека использует low_level.so, вызывая функцию dlopen (для загрузки low_level.so) и функцию dlsym (для получения адреса, где этот символ загружается в память).
  3. Прикладная программа (с функцией main) - это приложение связывает статическую библиотеку high_level.a, которая внутренне вызывает требуемую функцию из библиотеки low_level.so.

Текущие сценарии (работает / не работает)

  1. Вышеприведенная структура работает для случаев, когда я не использую инструменты lcov/gcov для покрытия кода.
  2. Мне удалось использовать инструменты lcov/gcov для получения покрытия кода статической библиотеки 'high_level.a'.
  3. Я попытался получить покрытие кода разделяемой библиотеки 'low_level.so', используя lcov/gcov из приведенной выше структуры, но безуспешно, ниже приведены шаги, которые были предприняты, и ошибка:

    • Добавлены флаги "-fprofile-arcs" "-ftest-покрытие" при компиляции библиотеки "low_level.so". И создал библиотеку.

    • Добавлена ​​опция -coverage для компиляции библиотеки 'high_level.a'. И создал библиотеку.

    • Добавлен 'LFLAGS=-lgcov -coverage' для прикладной программы (с функцией 'main'). И создал исполняемое приложение.

    • Теперь, когда я попытался выполнить вышеупомянутую скомпилированную прикладную программу, я получаю ниже ошибку для dlopen: не удалось dlopen: /home/test/libXXX.so: неопределенный символ: __gcov_merge_add

Вопросы?:

  1. Означает ли это, что dlopen нельзя использовать с lcov/gcov, и нам нужно на самом деле связать разделяемую библиотеку в статической библиотеке (изменив текущий код статической библиотеки на тот же)? Или что-то, чего мне не хватает, чтобы заставить lcov/gcov работать с длопеном?

Примечание: весь код в 'C'.

К вашему сведению, я искал то же самое и нашел какой-то похожий вопрос, который все еще отставал от выбранного лучшего ответа: как найти покрытие библиотеки, открытой с помощью dlopen()? Также не было хорошего указателя в сети, кроме возможности не использовать dlopen.

2 ответа

Решение

Спасибо Мат за предоставленную информацию и мысли.

В дополнение к этому, выполнив несколько проб и ошибок, я наконец смог решить проблему, добавив опции "-fprofile-arcs" и "-ftest-покрытие" в качестве флагов компоновщика, в дополнение к флагам компилятора при компиляции low_level. так что библиотека.

Я решил это, добавив -lgcov к связыванию с общей библиотекой.

Другие вопросы по тегам