2016-07-07 36 views
0

Angenommen, das folgende Linkerskript wird für Layout eine ausführbare Datei verwendet.Wie können Sie die in einer ELF-Datei aufgezeichneten Informationen zum Schnittlayout anzeigen?

SECTIONS 
{ 
. = 0x10000; 
.text : { *(.text) } 
.data : { *(.data) } 
.bss : { *(.bss) } 
} 

OUTPUT_FORMAT(ELF) 

Meine Fragen sind:

  1. Ich denke, solches Layout Informationen in der Ausgabe ELF-Datei gespeichert werden müssen, damit die loader die ausführbare Datei auf diesen Informationen basierend laden kann. Recht?

  2. Wenn 1 wahr ist, wie kann man solche Layout-Informationen in einer ELF anzeigen? objdump?

Antwort

0

Ich suchte ein wenig und fand etwas.

Für 1. Nach ELF format on wikipedia gibt es program headers, die die Adresse Layout-Informationen aufzeichnen.

Für 2. readelf ist ein vielversprechendes Werkzeug.

1
  1. Ich denke, solches Layout Informationen in der Ausgabe ELF-Datei gespeichert werden müssen, damit der Lader die ausführbare Datei auf diesen Informationen basierend laden kann. Recht?

ELF steht für ausführbare Datei und die Verknüpfung Format.

Die .text, .data usw. sind Teil der Verknüpfung Format. Während sie in der Regel in der vollständig verknüpften binären vorhanden sind, können sie entfernt werden. Die Informationen, die der Loader zum Laden der ausführbaren Datei benötigt, werden als Tabelle Segmente (Elf{36,64}_Phdr[]) gespeichert.

  1. Wenn 1 wahr ist, wie solches Layout Informationen in einem ELF sehen? objdump?

können Sie Segmente prüfen (und, falls die optionale Bereich Tabelle vorhanden ist, die Zuordnung von Abschnitten Segmente) mit readelf -Wl a.out.

0

Sie können die Informationen aus dem Linker-Befehlsskript ableiten, indem Sie sich die Ausgabe der Option -S in readelf ansehen.

$ readelf -S $(which ls) 
There are 28 section headers, starting at offset 0x1f6f8: 

Section Headers: 
    [Nr] Name    Type    Address   Offset 
     Size    EntSize   Flags Link Info Align 
    [ 0]     NULL    0000000000000000 00000000 
     0000000000000000 0000000000000000   0  0  0 
    [ 1] .interp   PROGBITS   0000000000400238 00000238 
     000000000000001c 0000000000000000 A  0  0  1 
    [ 2] .note.ABI-tag  NOTE    0000000000400254 00000254 
     0000000000000020 0000000000000000 A  0  0  4 
    [ 3] .note.gnu.build-i NOTE    0000000000400274 00000274 
     0000000000000024 0000000000000000 A  0  0  4 
    [ 4] .gnu.hash   GNU_HASH   0000000000400298 00000298 
     0000000000000104 0000000000000000 A  5  0  8 
    [ 5] .dynsym   DYNSYM   00000000004003a0 000003a0 
     0000000000000c48 0000000000000018 A  6  1  8 
    [ 6] .dynstr   STRTAB   0000000000400fe8 00000fe8 
     0000000000000582 0000000000000000 A  0  0  1 
    [ 7] .gnu.version  VERSYM   000000000040156a 0000156a 
... 

Wenn Sie wissen möchten, wo das herkommt, für Ihre Werkzeugkette an den Standard-Linker Befehlsscripts einen Blick; Dieser Standardwert wird verwendet, wenn Sie nicht explizit einen eigenen erstellt haben. Ich denke, dass es zwischen ihnen auch eine Erbschaft geben kann, aber ich kann nicht mit Sicherheit sagen.

$ ls -l /usr/lib/ldscripts/ | grep elf 
-rw-r--r-- 1 root root 9027 Mar 22 04:05 elf32_x86_64.x 
-rw-r--r-- 1 root root 8880 Mar 22 04:05 elf32_x86_64.xbn 
-rw-r--r-- 1 root root 8706 Mar 22 04:05 elf32_x86_64.xc 
-rw-r--r-- 1 root root 9024 Mar 22 04:05 elf32_x86_64.xd 
-rw-r--r-- 1 root root 8720 Mar 22 04:05 elf32_x86_64.xdc 
-rw-r--r-- 1 root root 8680 Mar 22 04:05 elf32_x86_64.xdw 
-rw-r--r-- 1 root root 9027 Mar 22 04:05 elf32_x86_64.xn 
-rw-r--r-- 1 root root 5443 Mar 22 04:05 elf32_x86_64.xr 
-rw-r--r-- 1 root root 8551 Mar 22 04:05 elf32_x86_64.xs 
-rw-r--r-- 1 root root 8247 Mar 22 04:05 elf32_x86_64.xsc 
-rw-r--r-- 1 root root 8207 Mar 22 04:05 elf32_x86_64.xsw 
-rw-r--r-- 1 root root 5489 Mar 22 04:05 elf32_x86_64.xu 
-rw-r--r-- 1 root root 8666 Mar 22 04:05 elf32_x86_64.xw 
-rw-r--r-- 1 root root 8396 Mar 22 04:05 elf_i386.x 
-rw-r--r-- 1 root root 8249 Mar 22 04:05 elf_i386.xbn 
-rw-r--r-- 1 root root 8209 Mar 22 04:05 elf_i386.xc 
-rw-r--r-- 1 root root 8389 Mar 22 04:05 elf_i386.xd 
-rw-r--r-- 1 root root 8219 Mar 22 04:05 elf_i386.xdc 
...