Frage

Im Rahmen des Versuchs, einen Compiler komplett von Grund auf neu zu schreiben, arbeite ich derzeit an dem Teil, der ELF-Dateien verarbeitet.

Nachdem ich mehrere Artikel und Spezifikationen über sie durchgesehen habe, verstehe ich immer noch nicht ganz, wo Abschnitt-zu-Segment-Zuordnungen gespeichert sind.Wenn ich kleine ausführbare Dateien beobachte, die von NASM + ld generiert wurden, kann ich sehen, dass die .der Textabschnitt wird irgendwie einem Programmheader vom Typ LADEN zugeordnet, aber wie?

Ein kleiner Teil der Ausgabe von readelf, wenn eine kleine (funktionierende) ausführbare Datei als Eingabe angegeben wird:

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000000084 0x0000000000000084  R E    200000

 Section to Segment mapping:
  Segment Sections...
   00     .text 

Ist diese Zuordnung überhaupt erforderlich, um eine funktionierende ausführbare Datei zu haben?Oder können sie komplett weggelassen werden und Sie hätten immer noch eine gültige ausführbare Datei?

War es hilfreich?

Lösung

Ich verstehe immer noch nicht ganz, wo Abschnitt-zu-Segment-Zuordnungen gespeichert sind.

Sie sind nicht überall gespeichert.

Eher, readelf berechnet das Mapping anhand des Dateiversatzes und der Größe von Abschnitten und Segmenten.

Andere Tipps

Ich habe einen Test nach dem @Angestellten Russisch gemacht.

readelf -l./libandroid_servers.so

Elf file type is DYN (Shared object file)
Entry point 0x0
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x00000034 0x00000034 0x000c0 0x000c0 R   0x4
  LOAD           0x000000 0x00000000 0x00000000 0x0f830 0x0f830 R E 0x1000
  LOAD           0x010000 0x00010000 0x00010000 0x00cf4 0x011ac RW  0x1000
  DYNAMIC        0x010540 0x00010540 0x00010540 0x00130 0x00130 RW  0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0
  EXIDX          0x00f2e8 0x0000f2e8 0x0000f2e8 0x00548 0x00548 R   0x4

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .hash .dynsym .dynstr .rel.plt .rel.dyn .plt .text .rodata .ARM.extab .ARM.exidx 
   02     .init_array .fini_array .data.rel.ro .dynamic .got .data .bss 
   03     .dynamic 
   04     
   05     .ARM.exidx 

01 Offset LADEN: 0x000000 Dateigröße 0x0f830
.ARM.exidx Endadresse des Abschnitts: hexadezimal(0x00f2e8 + 0x00548) = 0xf830

02 Lastversatz:0x010000 Dateigröße:0x00 cf4
.init_array Abschnitt beginnen Adresse: 10000h
.bss Abschnittsende Adresse: hex(0x00f2e8 + 0 ) = 0x10cf4

Sie sehen die readelf drucken Sie die Abschnitte in Segmenten sicher nach Berechnungen aus.Sie passen gut zusammen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top