dlopen не работает с инструментами покрытия кода (lcov/gcov)
Структура всего приложения:
- В общей библиотеке говорят - low_level.so.
- Статическая библиотека говорит - high_level.a. Эта статическая библиотека использует low_level.so, вызывая функцию dlopen (для загрузки low_level.so) и функцию dlsym (для получения адреса, где этот символ загружается в память).
- Прикладная программа (с функцией main) - это приложение связывает статическую библиотеку high_level.a, которая внутренне вызывает требуемую функцию из библиотеки low_level.so.
Текущие сценарии (работает / не работает)
- Вышеприведенная структура работает для случаев, когда я не использую инструменты lcov/gcov для покрытия кода.
- Мне удалось использовать инструменты lcov/gcov для получения покрытия кода статической библиотеки 'high_level.a'.
Я попытался получить покрытие кода разделяемой библиотеки '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
Вопросы?:
- Означает ли это, что dlopen нельзя использовать с lcov/gcov, и нам нужно на самом деле связать разделяемую библиотеку в статической библиотеке (изменив текущий код статической библиотеки на тот же)? Или что-то, чего мне не хватает, чтобы заставить lcov/gcov работать с длопеном?
Примечание: весь код в 'C'.
К вашему сведению, я искал то же самое и нашел какой-то похожий вопрос, который все еще отставал от выбранного лучшего ответа: как найти покрытие библиотеки, открытой с помощью dlopen()? Также не было хорошего указателя в сети, кроме возможности не использовать dlopen.
2 ответа
Спасибо Мат за предоставленную информацию и мысли.
В дополнение к этому, выполнив несколько проб и ошибок, я наконец смог решить проблему, добавив опции "-fprofile-arcs" и "-ftest-покрытие" в качестве флагов компоновщика, в дополнение к флагам компилятора при компиляции low_level. так что библиотека.
Я решил это, добавив -lgcov к связыванию с общей библиотекой.