(廢) 整合開發環境 (IDE) 包辦一切,鮮少揭露細節。
(廢) Hello World (?
處理「前處理」指令
#include
#define
#if
/#ifdef
/…最核心部份,詳見 2.2。
組合語言 → 機器碼
(廢)
切字詞 lex
串語法 yacc
檢查語法之語意
中間碼 與 最佳化
目的碼 與 最佳化
總之就是 調整位址
(廢)
(廢) 目的檔 是編譯後但未連結 (未調整符號、位址) 的 執行檔 片段。
.com
*.o
*.obj
.a
/.so
.lib
/.dll
file
以檢視格式.code
/.text
).data
).bss
.data
,但畢竟 內容皆為 0。(廢) 我:用 TCP/IP 比喻比較容易理解嗎?
objdump
(跨平台,在 Windows 也支援 PE)readelf
size
)Size
File off
(file offset)CONTENTS
– 區段在檔案中存在ALLOC
– …??objdump -s
(以 16 進位) 印出區段內容objdump -d
反組譯.data
區段
.rodata
區段
const
)、字串常數const
:誤觸則作業系統認作非法操作.data
.bss
區段
.bss
static
) 全域變數,直接在 .bss
中。.
開頭。__attribute__((section("foobar")))
將變數或程式放入指定區段.text
.data
.bss
readelf -h
來檢視內容Elf32_Ehdr
– elf.h型別
32-bit | 64-bit | |||
---|---|---|---|---|
位址 | Elf32_Addr |
uint32_t |
Elf64_Addr |
uint64_t |
位移 | Elf32_Off |
uint32_t |
Elf64_Off |
uint64_t |
短正整數 | Elf32_Half |
uint16_t |
Elf64_Half |
uint16_t |
正整數 | Elf32_Word |
uint32_t |
Elf64_Word |
uint32_t |
整數 | Elf32_Sword |
int32_t |
Elf64_Sword |
int32_t |
欄位
e_ident
0x7f 0x45 0x4c 0x46
(<DEL>ELF
)e_type
:檔案類型
e_machine
:機器類型
e_version
e_entry
e_phoff
e_shoff
:段頭表位置e_flags
e_ehsize
e_phentsize
e_phnum
e_shentsize
e_shnum
e_shstrndx
readelf -S
來檢視內容
objdump -h
省略了部份輔助性區段Elf32_Shdr
– elf.h欄位
sh_name
:區段名稱sh_type
:區段類型
sh_flags
sh_addr
sh_offset
sh_size
sh_link
sh_info
sh_addralign
sh_entsize
.text
與 .rel.text
.strtab
(string table).shstrtab
(section header string table)readelf
objdump
nm
.symtab
區段Elf32_Sym
- elf.h欄位
st_name
:符號名稱 (字串表)st_value
:不同符號有不同意思st_size
:資料型別的大小st_info
st_other
:未使用st_shndx
:符號所在區段於段頭表之索引
SHN_ABS
:絕對的值SHN_COMMON
:COMMON 區塊的符號SHN_UNDEF
:未定義 (在其他目的檔)詳見 4.6 連結流程控制
_executable_start
指令區段開頭 (不是進入點)_etext
指令區段結尾_edata
資料區段結尾_end
程式結尾 (??_foo
(舊 Linux、Windows,或以參數開關)_foo_
C++
c++filt
extern "C"
extern "C"
選用 C 語言的修飾方式#ifdef __cplusplus
以相容 C/C++__attribute__((weak))
__attribute__((weakref))
gcc -g
strip
下一章討論如何組合起來
連結多個 目的檔 成 執行檔
a.c
main
shared
swap
b.c
shared
swap
a.o
+ b.o
→ ab
(廢)
需要對齊分頁,而有空間浪費。
objdump
觀察 ld
前後
各個符號的最終位置也確定了
指令使用到符號之處也要逐一修正
.text
便有 .rel.text
)重定表上的 GLOBAL
類型符號會有不少是 UND
(undefined)
cat /proc/12345/maps
lib.so
libc-2.6.1.so
ld-2.6.so
(動態連結器)