2015-07-07 4 views
2

В основном, что спрашивает название.Ссылка на переменную по имени в C++ с использованием таблицы символов

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

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

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

+1

Выберите контейнер, который имеет смысл. Выиграть! –

+0

подсказки ключевых слов для ['std :: map'] (http://en.cppreference.com/w/cpp/container/map) или [' std :: unordered_map'] (http: // ru. cppreference.com/w/cpp/container/unordered_map) – NathanOliver

ответ

3

Вот пример программы, которая показывает, как использовать 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" бит предотвращает name mangling, обеспечивая запись таблицы символов это просто "my_variable" текст передается dlsym(). Вы не могли использовать extern "C" и предоставить искаженное имя, но это было бы специфичным для компилятора.

Для компиляции кода используйте:

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

-ldl является библиотека для dlsym и -rdynamic просит не отбрасывать символьной информации для, казалось бы, неиспользуемые переменные (см here):

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

выхода на моей машине:

my_variable @0x401010 42 
+1

Спасибо, @TonyD, это именно то, что мне нужно для начала работы над тем, над чем я работаю. – MrMattL92

1

@TonyD имеет по существу правильный ответ. Для более подробного обсуждения использования разделяемых библиотек this is a pretty decent tutorial

+0

Спасибо за эту ссылку, @ricecake, определенно помогает с более глубоким пониманием функций и наименований – MrMattL92

 Смежные вопросы

  • Нет связанных вопросов^_^