В основном то, что просит название.
Быть немного незнакомым с C++
и более продвинутые концепции, такие как таблицы символов, я изучил их в Интернете, но изо всех сил пытаюсь найти какое-либо направление к моей конечной цели. Большинство уроков, которые я видел, предназначены для C, и самый близкий вопрос, который я нашел (Вот) кладет меня к кирпичной стене, так как я пытался ее скомпилировать, но я не получаю желаемых результатов, и я не слишком уверен в том, как extern "C"
работает еще.
К концу этого я хочу получить доступ к переменной из таблицы символов и изменить переменную. Я играл с nm
а также objdump
(и исходя из аппаратного обеспечения, это определенно круто смотреть), и я посмотрел на dlsym
, dlopen
и т. д., но я не уверен, как это могло бы помочь мне (тем более, что я видел, как он используется в C больше всего на свете).
Любой совет или небольшие фрагменты кода (так что я могу написать свой собственный пример программы) был бы отличным. Просто добавлю, что это в системе Linux с некой устаревшей версией G ++ (я сейчас не на машине, поэтому у меня нет этой информации), и у меня нет доступа для ее обновления прямо сейчас.
Вот пример программы, которая показывает, как использовать 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
@TonyD имеет по существу правильный ответ. Для более подробного обсуждения того, как использовать общие библиотеки, это довольно приличный урок