Warum zeigt objdump die Abschnitte .bss, .shstratab, .symtab und .strtab nicht an?

Lesezeit: 2 Minuten

Ich mache derzeit meine eigene objdump-Implementierung in C.

Für meine Option -s muss ich den vollständigen Inhalt des Abschnitts einer ELF-Datei anzeigen.

Ich mache es gut, aber ich zeige mehr Abschnitte als das “echte” objdump.

Tatsächlich werden die Abschnitte .bss, .shstrtab, .symtab und .strtab nicht ausgegeben.

Ich sehe mich im sh_flags-Wert der Shdr-Struktur um, kann aber keine Logik finden …

Warum zeigt objdump -s diese Abschnitte nicht an?

  • ELF ist ziemlich komplex, GNU objdump basiert auf BFD, einer Bibliothek, die das schwere Heben übernimmt (Teil von binutils).

    – Vonbrand

    4. März 2014 um 0:46 Uhr

  • Ja, ich kenne die BFD-Bibliothek. Auf den Apple Open Sources kann ich sehen (section->flags & SEC_HAS_CONTENTS) um den Abschnitt anzuzeigen oder nicht. Auf meinem Computer hat .bss die gleichen Flags wie andere Abschnitte, die angezeigt werden.

    Benutzer1746732

    4. März 2014 um 0:54 Uhr

Warum zeigt objdump -s diese Abschnitte nicht an?

Objdump basiert auf libbfddas viele Komplexitäten von ELF abstrahiert und geschrieben wurde, als Objekte dazu neigten nur drei Abschnitte haben.

Als solche, objdump ist ziemlich mangelhaft. Zusätzlich dazu, dass (einige) vorhandene Abschnitte nicht angezeigt werden, kann es auch Abschnitte „synthetisieren“, die überhaupt nicht existieren, und andere seltsame Tricks ausführen. Das ist eher ein libbfd Fehler — seine Abstraktionsschicht teilt objdump einfach nicht die “fehlenden” Abschnitte mit.

TL;DR: nicht verwenden objdump. Verwenden readelf stattdessen.

  • Ok, also ist dieses Verhalten nicht wirklich gewollt? Für meinen objdump zeige ich jeden Abschnitt. Vielen Dank ! Übrigens verwende ich auch lieber readelf, objdump ist ein Schulprojekt.

    Benutzer1746732

    5. März 2014 um 8:59 Uhr

  • stackoverflow.com/questions/8979664/…

    – Ciro Santilli Путлер Капут 六四事

    26. Mai 2015 um 7:36 Uhr

Versuchen Sie es mit sh_size und sh_type anstelle von sh_flags.

Zitat aus der ELF-Spezifikation

sh_size Dieses Mitglied gibt die Größe des Abschnitts in Byte an. Sofern der Abschnittstyp nicht SHT_NOBITS ist, belegt der Abschnitt sh_size Bytes in der Datei. Ein Abschnitt vom Typ SHT_NOBITS kann eine Größe ungleich Null haben, belegt aber keinen Platz in der Datei

  • Es scheint, dass nur .bss und .got vom Typ SHT_NOBITS sind. Es erklärt also nicht, warum .shstrtab, .symtab und .strtab nicht angezeigt werden …

    Benutzer1746732

    4. März 2014 um 8:06 Uhr

  • Hier ist meine Schlussfolgerung: Ein Abschnitt wird angezeigt, wenn er mindestens ein Flag hat (im Gegensatz zu .shstrtab, .symtab und .strtab) oder wenn sein Typ nicht NOBITS ist (im Gegensatz zu .bss). Jemand eine andere Idee?

    Benutzer1746732

    4. März 2014 um 8:37 Uhr

  • Also, ich habe ein Cons-Beispiel gefunden: .gnu_debuglink hat kein Flag und wird von objdump -s angezeigt

    Benutzer1746732

    4. März 2014 um 9:44 Uhr


1154140cookie-checkWarum zeigt objdump die Abschnitte .bss, .shstratab, .symtab und .strtab nicht an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy