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

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

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

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

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


person MrMattL92    schedule 07.07.2015    source источник
comment
Выберите подходящий контейнер. Выиграть!   -  person Captain Obvlious    schedule 07.07.2015
comment
пара "ключ-значение" указывает на std::map или _ 2_   -  person NathanOliver    schedule 07.07.2015


Ответы (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
person Tony Delroy    schedule 07.07.2015
comment
Спасибо, @TonyD, это именно то, что мне нужно, чтобы начать то, над чем я работаю. - person MrMattL92; 07.07.2015

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

person ricecake    schedule 07.07.2015
comment
Спасибо за эту ссылку, @ricecake, определенно помогает с немного более глубоким пониманием функций и искажения имен - person MrMattL92; 07.07.2015