Просто, чтобы дать вам некоторый контекст, вот что я пытаюсь достичь: Я вставляю const char * в общий файл объекта, чтобы иметь строку версии в самом файле .so. Я делаю анализ данных, и эта строка позволяет мне сообщить, какая версия программного обеспечения создала его. Все это прекрасно работает.Смещение в значении символа nm?
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь напрямую прочитать строку из библиотеки .so. Я пытался использовать
nm libSMPselection.so | grep _version_info
и получить
000000000003d968 D __SMPselection_version_info
это все хорошо, как и ожидалось (полукокс * называется _SMPselection_version_info). Однако я ожидал, что теперь вы сможете открыть файл, искать 0x3d968 и начать читать мою строку, но все, что я получаю, это мусор.
Когда я открываю файл .so и просто ищу содержимое строки (я знаю, как она начинается), я могу найти ее по адресу 0x2e0b4. По этому адресу он там, нуль завершен и как и ожидалось. (Я использую этот метод на данный момент.)
Я не компьютерный ученый. Может ли кто-нибудь объяснить мне, почему значение символа, показанное nm, неверно или по-другому, каково значение символа, если оно не является адресом символа?
(Кстати, я работаю на Mac с OSX 10.7)
Это отличная идея. Я пытаюсь это прямо сейчас. Существует только одна проблема: библиотеки, которые я тестирую, имеют довольно длинную цепочку зависимостей от других библиотек. Если я попытаюсь загрузить с помощью dlopen, то получаю ошибки, не найденные Symbol. Конечно, строка версии, которая меня интересует, не имеет зависимостей. Как заставить dl игнорировать зависимости? – Simon
Я проверил. Это отлично работает, если у меня загружены все зависимости, которые являются одним из моих двух вариантов использования. Спасибо за идею. – Simon