2016-07-07 36 views
0

假設以下連接腳本用於佈局可執行文件。如何查看ELF文件中記錄的部分佈局信息?

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

OUTPUT_FORMAT(ELF) 

我的問題是:

  1. 我認爲這樣的佈局信息必須存儲在輸出ELF文件,因此裝載機可以加載基於該信息的可執行文件。對?

  2. 如果1爲真,如何在ELF中查看這樣的佈局信息? objdump的?

回答

0

我搜索了一下,發現了一些東西。

對於1.根據ELF format on wikipedia,有program headers記錄地址佈局信息。

對於2 readelf是一個有前途的工具。

1
  1. 我認爲這樣的佈局信息必須存儲在輸出ELF文件,使裝載機可以加載基於該信息的可執行文件。對?

ELF代表可執行文件和鏈接格式。

.text,.data等都是鏈接格式的的一部分。雖然他們通常存在於完全鏈接的二進制文件中,但他們可以刪除

加載器需要加載可執行文件的信息存儲爲段的表Elf{36,64}_Phdr[])。

  1. 如果1爲真,如何在ELF中查看這樣的佈局信息? objdump的?

可以檢查段(和,如果可選的部分表存在時,部分以段的映射)與readelf -Wl a.out

0

通過查看readelf中的-S選項的輸出,您可以從鏈接器命令腳本中推斷出信息。

$ 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 
... 

如果你想知道這是來自,看看你的工具鏈默認鏈接命令腳本;如果你沒有明確地創建你自己的,則使用這個默認值。我認爲他們之間也可能有一些繼承關係,但我不能肯定地說。

$ 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 
... 
相關問題