Pytanie teoretyczne o nazewnictwo zmiennych i funkcji a wynik końcowu

1

Jako, że lubię wszystko wiedzieć, a dopiero się uczę i wiem niewiele, chciałbym wiedzieć czy nazewnictwo moich zmiennych, klas, funkcji można w jakikolwiek sposób odczytać w moim pliku wykonywalnym, chodzi mi o natywny język C++. Czy takie zmienne są reprezentowane inaczej, jeśli tak to jak ?

Początkowo myślałem, że nie ma to żadnego wpływu jak nazwie zmienną gdyż kompilator i tak nazwie ją po swojemu, lecz zmyliła mnie funkcja GetProcAddress do której przekazujemy nazwę funkcji, więc de facto zwraca ona adres funkcji po nazwie, więc te nazwy funkcji nadane przeze mnie muszą być jednak gdzieś przechowywane. Jak to w końcu jest ?

1

W C (nie C++), każda funkcja ma przypisany label, który jest identyczny z tym jaki masz w kodzie, przez co w czasie assemblacji w kodzie zostają one potem zachowane, jednak to dotyczy tylko C, w C++ są one tzw. "manglowane" (https://en.wikipedia.org/wiki/Name_mangling) co umożliwia przeładowanie funkcji, ale uniemożliwia określenie ich nazwy po kompilacji.

0

GetProcAddress - Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).
Tyczy się więc to bibliotek, które mają sekcję wyeksportowanych funkcji. W normalnych EXE nie ma potrzeby posługiwania się nazwami, wywoływany jest CALL ze wskaźnikiem do funkcji. Można też skompilować program z symbolami debugującymi i wtedy debugger będzie oznaczał te funkcje nazwą a nie adresem. Jeśli chcesz więcej informacji poszukaj czegoś o Reverse Engeneering i assemblerze

1

Nazwy zmiennych giną, ale nazwy funkcji i metod nie, chociaż są specjalnie modyfikowane
https://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B

0

Kiedy eksportujesz funkcje w DLL to możesz nadać funkcji "eksportowy numer" oraz "eksportową nazwę" domyślnie numer kolejny zaś nazwa taka jak jest.
Kiedy kompilujesz do postaci biblioteki są prawie tak jak nazwałeś.
No i symbole do debugera zapisywane są w pliku wykonywalnym o ile kazałeś je tam zapisać i nie usunąłeś jakimś strip'em.

0

Dziękuje wszystkim za rozjaśnienie mi tematu, teraz wszystko jasne. Dla każdego +1 :)

Mam jeszcze jedno pytanie, a co z zmiennymi globalnymi do których dodamy modyfikatory static const, takie zmienne są znane w 'całym' programie od początku do końca, więc muszą one być jakoś identyfikowane, ale jak? Przez nazwę, czy kompilator również to jakoś zamienia?

0

Zalezy co dalej sie z ta stala dzieje.
Jesli jest czasu kompilacji to zamienia wszelkie uzycia jej wartoscia w czasie kompilacji.
Jesli nie jest, to alokuje jakies miejsce w pamieci i trzyma adres.

1 użytkowników online, w tym zalogowanych: 0, gości: 1