Forum: PC Hard- und Software In welche Form werden die Namen von Datenobjekten/Funktionen in einer ausführbaren Datei abgebildet


von Polohemd (Gast)


Lesenswert?

Frage steht ja schon im Titel. Werden die am Ende einfach als Adressen 
übersetzt?

: Verschoben durch Moderator
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hängt von der Programmiersprache, Plattform, Compiler/Interpreter und 
-Einstellungen ab.

von Polohemd (Gast)


Lesenswert?

Wo kann man sowas denn genau nachlesen? Würde mich interessieren wie das 
bei der Sprache C ist, mit GCC.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Polohemd schrieb:
> Wo kann man sowas denn genau nachlesen?

In der Spezifikation des Ausgabeformats, also z.B. ELF, COFF, PE...

Polohemd schrieb:
> Würde mich interessieren wie das
> bei der Sprache C ist, mit GCC.

Der Programmcode (Instruktionen) greift auf Variablen und Sprungziele 
(Funktionen) nur über Adressen zu, d.h. der Code an sich funktioniert 
ganz ohne Text-basierte Namen. Programmdateien können aber 
Debug-Informationen und/oder Symboltabellen enthalten, welche den 
Adressen Namen geben. Der dynamische Linker nutzt die namensbasierten 
Symboltabellen um Funktionen und Variablen in dynamischen Bibliotheken 
(DLL, SO) zu finden.

von Sebastian S. (amateur)


Lesenswert?

Wozu soll so etwas im Executeable abgespeichert werden.
Namen sind - im wahrsten Sinne des Wortes - Schall und Rauch. Das gilt 
auch für Nichtraucher.
Für den Compiler ist es nur wichtig, an welcher Adresse eine Variable 
oder eine Funktion rumhängt. Mehr nicht! Es erfolgt dann ein Sprung auf 
die Adresse XYZ oder der Zugriff auf die Variable, die an der Stelle ABC 
liegt.

von Sebastian S. (amateur)


Lesenswert?

Ich vergaß:
Oft weis nicht mal der Compiler wo was ist, sondern erst der Linker.

von Erwin D. (Gast)


Lesenswert?

Sebastian S. schrieb:
> Ich vergaß:
> Oft weis nicht mal der Compiler wo was ist, sondern erst der Linker.

...der seinerseits die Relocation-Infos vom Compiler bekommt.
Aber du hast insofern recht, die endgültigen Adressen erzeugt erst der 
Linker (mithilfe der relativen Adressen, die vom Compiler kommen).

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Polohemd schrieb:
> Wo kann man sowas denn genau nachlesen? Würde mich interessieren wie das
> bei der Sprache C ist, mit GCC.

https://www.gnu.org/software/gcc/
https://gcc.gnu.org/onlinedocs/gccint/
https://sourceware.org/binutils/docs-2.32/

von c-hater (Gast)


Lesenswert?

Erwin D. schrieb:

> Aber du hast insofern recht, die endgültigen Adressen erzeugt erst der
> Linker (mithilfe der relativen Adressen, die vom Compiler kommen).

Nichtmal das ist immer wahr. Es kann nämlich noch eine weitere Runde 
Relokation passieren, beim Laden des Binary in den Arbeitsspeicher. Und 
das aus unterschiedlichen Grunden.

Einmal natürlich das normale dynamische Linken gegen andere Binaries. 
Und dann solche Sicherheitsfeatures wie ASLR.

von georg (Gast)


Lesenswert?

c-hater schrieb:
> Es kann nämlich noch eine weitere Runde
> Relokation passieren, beim Laden des Binary in den Arbeitsspeicher

Und auch das sind nur virtuelle Adressen, die wahre physikalische 
Adresse weiss nur die MMU.

Georg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.