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 № 1Kró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.