/ / Pobieranie wszystkich zmiennych globalnych z skompilowanego pliku (linux). Jak oddzielić statyczne od const? - linux, zmienne globalne, nm

Pobieranie wszystkich zmiennych globalnych z pliku skompilowanego (Linux). Jak oddzielić statyczny od const? - linux, zmienne globalne, nm

Więc mam tu coś naprawdę dziwnego.

Na przykład mam 2 pliki .cpp, z których jeden zawiera

const std::string DICTIONARY_DEFAULT = "blah";
const std::string ADDTODICTIONARY_DEFAULT = "blah";
const std::string BUTTONS = "blah";

a drugi z

static int  x1;
static int  NewY1, NewY2, NewX1, NewX2;

Oba fragmenty znajdują się w sekcji zmiennych globalnych. Muszę wydrukować globalne zmienne statyczne (na przykład), ale ignorować stałe. W nm wyjście wyglądają zupełnie identycznie(typ b dla każdego przypadku, co oznacza niezainicjowany symbol zasięgu lokalnego). Czy jest jakiś sposób, aby automatycznie oddzielić te przypadki za pomocą tylko narzędzi linux (grep, regexps i tak dalej są w porządku)?

Odpowiedzi:

1 dla odpowiedzi № 1

Krótka odpowiedź: W każdym przypadku nie ma sposobu, aby to zrobić

Długa odpowiedź: Spójrz na SYMBOL TABLE używając "objdump-x plik. , w twoim przypadku deklarujesz dwa stałe obiekty std :: string, które są inicjowane przez wywołanie ich konstruktora przed uruchomieniem funkcji "main". logicznie „const, a nie naprawdę const.

Kompilator nie ma innego wyboru, jak przydzielić je do sekcji .bss ze wszystkimi innymi globalami. Jeśli dodasz następujący wiersz

const int willBeInRoData = 42;

Przekonasz się, że jego symbol będzie w sekcji .rodata i będzie można go odróżnić od innych globalnych liczb całkowitych.

UWAGA: oszukany z Spróbuj znaleźć zmienne globalne z skompilowanych plików. Program nie może odróżnić stałych od zmiennych globalnych. ponieważ pytanie jest dokładnie takie samo.