dlsym — ссылка на переменную по имени в C ++ с помощью таблицы символов

В основном то, что просит название.

Быть немного незнакомым с C++и более продвинутые концепции, такие как таблицы символов, я изучил их в Интернете, но изо всех сил пытаюсь найти какое-либо направление к моей конечной цели. Большинство уроков, которые я видел, предназначены для C, и самый близкий вопрос, который я нашел (Вот) кладет меня к кирпичной стене, так как я пытался ее скомпилировать, но я не получаю желаемых результатов, и я не слишком уверен в том, как extern "C" работает еще.

К концу этого я хочу получить доступ к переменной из таблицы символов и изменить переменную. Я играл с nm а также objdump (и исходя из аппаратного обеспечения, это определенно круто смотреть), и я посмотрел на dlsym, dlopenи т. д., но я не уверен, как это могло бы помочь мне (тем более, что я видел, как он используется в C больше всего на свете).

Любой совет или небольшие фрагменты кода (так что я могу написать свой собственный пример программы) был бы отличным. Просто добавлю, что это в системе Linux с некой устаревшей версией G ++ (я сейчас не на машине, поэтому у меня нет этой информации), и у меня нет доступа для ее обновления прямо сейчас.

2

Решение

Вот пример программы, которая показывает, как использовать dlsym посмотреть на символ:

#include <dlfcn.h>
#include <iostream>

extern "C" int my_variable = 42;

int main()
{
if (int* p = (int*)dlsym(NULL, "my_variable"))
std::cout << "my_variable @" << p << ' ' << *p << '\n';
else
std::cout << "dlsym failed\n";
}

extern "C" немного мешает название искажения, обеспечение записи таблицы символов просто "my_variable" текст передан dlsym(), Вы не могли использовать extern "C" и укажите искаженное имя, но это будет зависеть от компилятора.

Чтобы скомпилировать код, используйте:

g++ x.cc -o x -ldl -rdynamic

-ldl это библиотека для dlsym, а также -rdynamic просит не сбрасывать информацию о символах для, казалось бы, неиспользуемых переменных (см. Вот):

-rdynamic Передайте флаг -export-dynamic на линкер ELF, на цели, которые его поддерживают. Это указывает компоновщику добавлять все символы, а не только используемые, в таблицу динамических символов. Эта опция необходима для некоторых применений dlopen или чтобы разрешить получение следов из программы

Вывод на мою машину:

my_variable @0x401010 42
3

Другие решения

@TonyD имеет по существу правильный ответ. Для более подробного обсуждения того, как использовать общие библиотеки, это довольно приличный урок

1

По вопросам рекламы [email protected]