LINUX.ORG.RU

Анализ загрузки динамических библиотек.


0

1

Всем доброго времени суток.

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

P.S. Описание проблемы добавлю в следующем сообщении.

★★★★★

Собственно проблема, которую я пытаюсь решить:
Есть приложение, которое линкуется с несколькими .so библиотеками. Часть из них самописные, часть - стандартные. Еще одна часть - унаследованный код библиотек.

Очередная версия приложения отказывается стартовать на устройстве (ARM), но прекрасно стартует на PC(x86).

Путем эксперементов было обнаружено, что к краху приложения приводит его линковка с одной из библиотек (назовем ее для краткости libBad.so).

Если приложение не линкуется с libBad.so, то все работает прекрасно (в данный момент приложение урезано до printf(«Hello, world\n»)).
Если же произвести линковку с libBad.so, тогда приложение завершается по SIGSEG даже не заходя в функцию main (на первой строчке main(...) поставлен брейкпоинт).

Если необходимо, могу выложить выхлоп gdb при завершении.

trex6 ★★★★★ ()
Ответ на: комментарий от trex6

запусти под strace и посмотри на каком моменте отваливаются ноги )

shty ★★★★★ ()

>ldd
Выдает корректный список библиотек, с которыми слинковано приложение. Возможно есть и другой способ его использования?

strace

К сожалению в нашей сборке ФС его пока еще нет. Надо будет обязательно добавить.

В итоге проблему удалось решить ревизией кода libBad.so на предмет static членов классов, которые инициализирются вне методов класса.
В итоге один из них пытался инициализироватся собственным конструктором, который использовал libstdc.so, который в тот момент еще не был загружетн. Во всяком случае мне показалось именно так.

Сейчас инициализация этого члена вынесена в метод класса.

Всем спасибо за столь оперативные подсказки.

trex6 ★★★★★ ()
Ответ на: комментарий от trex6

который использовал libstdc.so

сомнительно, линкер должен такое учитывать. Разве что у libBad.so не прописано что оно зависит от stdc.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

К сожалению выхлоп strace я так и не смог распарсить (очень уж там много всего), но судя по всему ошибку вызывает функция nummem, которая возвращает 0. Возможно, где-то не обрабатывается ситуация, когда возвращается нулевой указатель и производится попытка его разименования.

Сейчас потратить время на полный анализ нет возможности.

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

trex6 ★★★★★ ()
Ответ на: комментарий от true_admin

> сомнительно, линкер должен такое учитывать. Разве что у libBad.so не прописано что оно зависит от stdc.

Порядок инициализации глобальных объектов НЕОПРЕДЕЛЁН (на практике он зависит от порядка указания библиотек), поэтому часто в проектах на С++ вылазят такие косяки.

anonymous ()
Ответ на: комментарий от anonymous

Порядок инициализации глобальных объектов НЕОПРЕДЕЛЁН

я не про это, я про то символы в либах.

true_admin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.