Солярис Эльфедит: Есть ли что-то подобное для Linux? (редактор общей библиотеки)? - PullRequest
3 голосов
/ 01 февраля 2010

Linux: есть ли способ редактировать скомпилированную разделяемую библиотеку?

В частности, я ищу, как добавить DT_SYMBOLIC flag в уже скомпилированную двоичную общую библиотеку?

Вот почему я спрашиваю это :

наше приложение состоит из

  • наши собственные библиотеки ( статические libXXX.a)
  • некоторые сторонние библиотеки ( общие двоичные файлы библиотеки libYYY.so)

Пока все отлично с приложением.

Теперь я заменил наши статические * libXXX.a на версии с общими библиотеками (libXXX.so).

Все компилируется и ссылки нормально.

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

Я искал по SOF и нашел интересную статью здесь .

Подсказка, на которую я ссылаюсь:

... add the DT_SYMBOLIC flag to the dynamic section ...

Хотя я сомневаюсь, что это действительно поможет, я думаю, что стоит попробовать.

Есть идеи, как добавить DT_SYMBOLIC flag к уже скомпилированной / связанной общей библиотеке?

среда : Debian Lenny 64bit с g ++ v4.2.4 и binutils v20.

EDIT : на солярисе есть программа под названием elfedit. Есть ли что-то похожее для Linux?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010

Тем временем я нашел инструмент под названием elfsh. Это интерактивная оболочка для изучения и редактирования объектов ELF, двоичных файлов и общих библиотек.

см. Здесь для страницы проекта: http://www.eresi -project.org

К сожалению, он не выглядит очень стабильным. Я испытал много сбоев внутри elfsh.

0 голосов
/ 01 февраля 2010

Если это просто флаг, то болезненный подход - настроить заголовок эльфа с помощью шестнадцатеричного редактора.

Но если сторонняя библиотека не работает, я бы лично посмотрел на другой конец: что изменилось в порядке загрузки библиотеки из-за того, что вы перешли в общий доступ.

LDD

и

export LD_DEBUG = libs

ваши друзья здесь.

dlopen () ваших общих библиотек после загрузки загрузчиком среды выполнения может быть достаточно.

...