Segmente innerhalb eines ausführbaren C-Programms

8

Ich habe über Abschnitte und Segmente gelesen. Anscheinend könnten Sie die Zuordnung zwischen Abschnitten und Segmenten wie folgt auflisten.

%Vor%

Meine Fragen,

  1. Ich konnte nicht verstehen, was die Header des Programms bedeuten. Wie hängen sie mit Segmenten zusammen?
  2. Abschnitt zu Segment-Zuordnung ist klar. Aber könnte jemand es benennen? Ich sehe nur Zahlen. Ich identifizierte den Code seg (03), Daten seg (02) und Stack (07).
John 09.08.2012, 13:33
quelle

2 Antworten

10

Um die Ausgabe von readelf zu verstehen, hilft es Ihnen, das Format einer ELF -Datei zu verstehen. Bitte lesen Sie dieses Dokument

Soweit zu verstehen, wie man die Ausgabe von readelf interpretiert, verlinke diesen Link kann hilfreich sein.

Was Ihre Frage 2 betrifft, beschreibt diesen Link die Segmente. Suchen Sie in diesem Dokument nach "Verschiedene Abschnitte enthalten Programm- und Steuerinformationen:", um den Bereich zu finden, in dem die Segmentnamen beschrieben werden.

Dieses Dokument beschreibt die Segmente wie folgt:

Verschiedene Abschnitte enthalten Programm- und Steuerinformationen:

%Vor%     
Chimera 09.08.2012, 17:28
quelle
2

Programmkopfzeilen in einer ELF-Binärdatei beschreiben, wie die Binärdatei ausgeführt werden soll. Die interessanten Teile sind die LOAD-Header, die einen Teil der Binärdatei an verschiedene Stellen im Speicher laden. Es könnte eine fast beliebige Anzahl von LOAD-Headern in einer Binärdatei geben, aber normalerweise stellt der Linker alles, was nur lesbar und ausführbar ist, in eins und alles liest / schreibt in ein anderes. Es gibt Betriebssysteme, die schreibgeschützte Daten LOAD-Header, Lese-Schreib-Daten und schreibgeschützten ausführbaren Code für etwas erhöhte Sicherheit haben.

Segmente hier bedeuten nur Teile der Binärdatei, die an verschiedenen Stellen im Speicher geladen sind. Also im Grunde die verschiedenen Lade-Header.

In Sections werden die Daten während der Verknüpfung organisiert. Aus verschiedenen Gründen möchten Sie eine bessere Granularität haben, um Dinge zu organisieren, als nur Daten / Code. Einige Daten sind schreibgeschützt, in Ihrem Beispiel ist sie ".rodata". Der Code befindet sich in ".text", initialisierte Daten befinden sich in ".data", während Daten in Variablen, die beim Programmstart auf Null gesetzt werden, in ".bss" sind.

Die "Abschnitt zu Segment-Zuordnung" sagt Ihnen, welche Abschnitte in welchen Segmenten sind (verschiedene LOAD-Header). So befinden sich ".text" und ".rodata" im ersten LOAD-Header (der dritte Programmheader) und ".data" befindet sich im zweiten LOAD-Header (vierter Programmheader).

Der Stack ist etwas, das Ihnen das Betriebssystem bei der Ausführung gibt, und es wird nicht von einer ELF-Binärdatei beschrieben.

    
Art 09.08.2012 14:15
quelle