假設以下連接腳本用於佈局可執行文件。如何查看ELF文件中記錄的部分佈局信息?
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
OUTPUT_FORMAT(ELF)
我的問題是:
我認爲這樣的佈局信息必須存儲在輸出ELF文件,因此裝載機可以加載基於該信息的可執行文件。對?
如果1爲真,如何在ELF中查看這樣的佈局信息? objdump的?
假設以下連接腳本用於佈局可執行文件。如何查看ELF文件中記錄的部分佈局信息?
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
OUTPUT_FORMAT(ELF)
我的問題是:
我認爲這樣的佈局信息必須存儲在輸出ELF文件,因此裝載機可以加載基於該信息的可執行文件。對?
如果1爲真,如何在ELF中查看這樣的佈局信息? objdump的?
- 我認爲這樣的佈局信息必須存儲在輸出ELF文件,使裝載機可以加載基於該信息的可執行文件。對?
ELF
代表可執行文件和鏈接格式。
.text
,.data
等都是鏈接格式的的一部分。雖然他們通常存在於完全鏈接的二進制文件中,但他們可以刪除。
加載器需要加載可執行文件的信息存儲爲段的表(Elf{36,64}_Phdr[]
)。
- 如果1爲真,如何在ELF中查看這樣的佈局信息? objdump的?
可以檢查段(和,如果可選的部分表存在時,部分以段的映射)與readelf -Wl a.out
。
通過查看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
...