Wo sollte der .bss-Abschnitt der ELF-Datei gespeichert werden?

8

Es ist bekannt, dass der Abschnitt .bss nicht auf der Festplatte gespeichert wurde, aber der Abschnitt .bss im Speicher sollte auf Null initialisiert werden. aber wo sollte es in der Erinnerung sein? Gibt es irgendwelche Informationen in der ELF-Kopfzeile angezeigt oder ist der .bss-Abschnitt wahrscheinlich neben dem Datenabschnitt oder etwas anderes ??

    
venus.w 02.05.2012, 09:12
quelle

2 Antworten

10

Um zu wissen, wo sich das bss-Segment im Speicher befindet, reicht es aus, readelf -S program auszuführen und die Spalte Addr in der Zeile .bss zu überprüfen.

In den meisten Fällen sehen Sie auch, dass der initialisierte Datenabschnitt ( .data ) unmittelbar davor steht. Das heißt, Sie werden sehen, dass Addr + Size des Abschnitts .data mit der Startadresse des Abschnitts .bss übereinstimmt.

Das ist jedoch nicht immer unbedingt der Fall. Dies sind historische Konventionen und die ELF-Spezifikation (zu lesen neben der plattformspezifischen Ergänzung, zum Beispiel Kapitel 5 in dem einen, der 32-bit x86-Maschinen abdeckt, ermöglicht viel komplexere Konfigurationen und nicht Alle werden von Linux unterstützt.

Zum Beispiel darf der Abschnitt nicht .bss heißen. Die einzigen 2 Eigenschaften, die einen BSS-Abschnitt ausmachen, sind:

  1. Der Abschnitt ist mit SHT_NOBITS gekennzeichnet (dh er belegt Speicherplatz im Speicher, aber keinen Speicher), der als NOBITS in readelf angezeigt wird.
  2. Es wird einem ladbaren ( PT_LOAD ), lesbaren ( PF_R ) und beschreibbaren ( PF_W ) Segment zugeordnet. Ein solches Segment ist auch im Speicher kürzer als im Speicher ( p_filesz & lt; p_memsz ).

Sie können mehrere BSS-Abschnitte haben: PowerPC-ausführbare Dateien können .sbss und .sbss2 für nicht initialisierte Datenvariablen haben.

Schließlich ist der BSS-Abschnitt nicht notwendigerweise neben dem Datenabschnitt oder dem Heap. Wenn Sie den Linux-Kernel (genauer die Funktion load_elf_binary ) überprüfen, können Sie dies tun Beachten Sie, dass die BSS-Abschnitte (genauer gesagt, das Segment , auf das es abgebildet wird) können sogar mit Code und initialisierten Daten verschachtelt werden. Der Linux-Kernel schafft das aus.

    
SquareRootOfTwentyThree 02.05.2012, 12:57
quelle
14

Das BSS ist zwischen den Daten und dem Haufen, wie in dies wunderbar beschrieben Artikel .

Sie können die Größe jedes Abschnitts mit size ermitteln:

%Vor%     
cnicutar 02.05.2012 09:21
quelle

Tags und Links