1
Ch7 Modules
2
7.a ELF 介紹
7.b Module 相依性
7.c Module Section
7.d 載入 Module
7.e 卸載 Module
3
7.a ELF 介紹
test.c
4
7.a ELF 介紹
optional
ELF Header
Program Header
Table(k 項 )
Section 1
Section 2
Section n
Section Header
Table(n 項 )
ELF Header
Program Header
Table(k 項 )
Segment 1
Section Header
Table(n 項 )
Segment k
optional
section 有各自的大小
有些 section 會出現在 table 之後
1 個 segment
由 1 到多個 section 組成
許多 section
不會對應到 segment
在硬碟上的執行檔 準備要執行的執行檔
( 依舊在硬碟上 )
5
.interp
.hash
.dynsym
.dynstr
.init
.text
.fini
.rodata
.dynamic
.data
.bss
.shstrtab
.symtab
.strtab
.rel.text
0x00000000
Kernel
Space
arm-test.o
arm-test
(Execution View)
arm-test
(Process)
.comment
arm-test
(Link View)
6
0x00000000
Kernel
Space
arm-test
(Execution View)
arm-test
(Process)
Kernel
Address Space
env. var.
arguments
mmap
text
data
heap
0x00000000
7
7.a ELF 介紹
userspace
kernelspace
由 ld.so 做解析 , 重定
(run time)
由 kernel 做解析 , 重定
VA
有些 symbol(ex: function) 的值 (ex: address)
要到 runtime 才會確定
從未知到確定 , 就稱為重定 (relocation)
由 ld 做解析
(compile time)
0x00000000
relocatable
executable
so
coredump
8
7.a ELF 介紹
Code
Exported
Functions
Code
Exported
Functions
Code
Exported
Functions
Compiled inModule
Kernelspace
Userspace
insmod
modprobe
rmmod
從書上抄的
考慮相依
不考慮相依
module 可以是 driver, filesystem, 或其它元件
1. 掛載某 filesystem, 如果 kernel 當下未 support 該 filesystem -> 載入 module(filesystem)
2. usb 隨身碟接上電腦 , 如果 kernel 當下未 support 該硬體 -> 載入 module(driver)
9
7.a ELF 介紹
Code
Exported
Functions
Code
Exported
Functions
Code
Exported
Functions
Compiled inModule
Kernelspace
Userspace
insmod
modprobe
rmmod
從書上抄的
考慮相依
不考慮相依
module 可以是 driver, filesystem, 或其它元件
1. 掛載某 filesystem, 如果 kernel 當下未 support 該 filesystem -> 載入 module(filesystem)
2. usb 隨身碟接上電腦 , 如果 kernel 當下未 support 該硬體 -> 載入 module(driver)
有三種
1. 誰都可使用
2. GPL 相容才可使用
3. 現在誰都可使用
之後會改成 GPL 相容才可使用
10
7.a ELF 介紹
7.b Module 相依性
7.c Module Section
7.d 載入 Module
7.e 卸載 Module
11
7.b Module 相依性
depend on
depend on
depend on
Kernel
Module A
Module B
12
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_defrag_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_conntrack_ftp
nf_conntrack
module
source_list
target_list
13
module
source_list
target_list
nf_defrag_ipv4
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
iptable_nat
nf_conntrack
module
source_list
target_list
14
module
source_list
target_list
nf_defrag_ipv4
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
iptable_nat
nf_conntrack
module
source_list
target_list
15
module
source_list
target_list
nf_defrag_ipv4
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
iptable_nat
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ftp
16
module
source_list
target_list
iptable_nat
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
nf_conntrack
module
source_list
target_list
17
module
source_list
target_list
nf_defrag_ipv4
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
iptable_nat
nf_conntrack
module
source_list
target_list
18
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
iptable_nat
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_defrag_ipv4
19
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
20
7.a ELF 介紹
7.b Module 相依性
7.c Module Section
7.d 載入 Module
7.e 卸載 Module
21
50
45
40
35
30
20
15
10
53
52
25
5
0
.rel.gnu...this_module
.gnu...this_module
.rel.data
.data
.ARM.extab
.rel__param
__param
.modinfo
.rel.ARM.exidx.exit.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
.rel.ARM.exidx.init.text
.ARM.exidx.init.text
.ARM.extab.init.text
.rel__ksymtab_gpl
__ksymtab_gpl
.rodata.str1.4
__ksymtab_strings
.rel.rodata
.rodata
.rel.exit.text
.exit.text
.rel.init.text
.init.text
.rel.text
.text
.ARM.exidx
.rel.ARM.exidx
.strtab
.symtab
.shstrtab
.rel.debug_ranges
.debug_ranges
.rel.debug_pubtypes
.debug_pubtypes
.rel.debug_loc
.debug_loc
.debug_str
.rel.debug_frame
.debug_frame
.rel.debug_line
.debug_line
.debug_abbrev
.rel.debug_info
.debug_info
.rel.debug_pubnames
.debug_pubnames
.rel.debug_aranges
.debug_aranges
.comment
.ARM.attributes
.note.GNU-stack
.bss
.note.gnu.build-id
以 arm 版本的 usb-storage.ko 為例
(section 大小非實際比例 )
22
.rel.gnu...this_module
.gnu...this_module
.rel.data
.data
.ARM.extab
.rel__param
__param
.modinfo
.rel.ARM.exidx.exit.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
.rel.ARM.exidx.init.text
.ARM.exidx.init.text
.ARM.extab.init.text
.rel__ksymtab_gpl
__ksymtab_gpl
.rodata.str1.4
__ksymtab_strings
.rel.rodata
.rodata
.rel.exit.text
.exit.text
.rel.init.text
.init.text
.rel.text
.text
.ARM.exidx
.rel.ARM.exidx
.strtab
.symtab
.shstrtab
.rel.debug_ranges
.debug_ranges
.rel.debug_pubtypes
.debug_pubtypes
.rel.debug_loc
.debug_loc
.debug_str
.rel.debug_frame
.debug_frame
.rel.debug_line
.debug_line
.debug_abbrev
.rel.debug_info
.debug_info
.rel.debug_pubnames
.debug_pubnames
.rel.debug_aranges
.debug_aranges
.comment
.ARM.attributes
.note.GNU-stack
.bss
.note.gnu.build-id
debug 相關
23
.rel.gnu...this_module
.gnu...this_module
.rel.data
.data
.ARM.extab
.rel__param
__param
.modinfo
.rel.ARM.exidx.exit.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
.rel.ARM.exidx.init.text
.ARM.exidx.init.text
.ARM.extab.init.text
.rel__ksymtab_gpl
__ksymtab_gpl
.rodata.str1.4
__ksymtab_strings
.rel.rodata
.rodata
.rel.exit.text
.exit.text
.rel.init.text
.init.text
.rel.text
.text
.ARM.exidx
.rel.ARM.exidx
.strtab
.symtab
.shstrtab
.comment
.ARM.attributes
.note.GNU-stack
.bss
.note.gnu.build-id
relocation 相關
24
.gnu...this_module
.data
.ARM.extab
__param
.modinfo
.ARM.exidx.exit.text
.ARM.extab.exit.text
.ARM.exidx.init.text
.ARM.extab.init.text
__ksymtab_gpl
.rodata.str1.4
__ksymtab_strings
.rodata
.exit.text
.init.text
.text
.ARM.exidx
.strtab
.symtab
.shstrtab
.comment
.ARM.attributes
.note.GNU-stack
.bss
.note.gnu.build-id
ARM 相關
25
.gnu...this_module
.data
__param
.modinfo
__ksymtab_gpl
.rodata.str1.4
__ksymtab_strings
.rodata
.exit.text
.init.text
.text
.strtab
.symtab
.shstrtab
.comment
.note.GNU-stack
.bss
.note.gnu.build-id
不重要 ?
或是我不知道它很重要
26
.gnu...this_module
.data
__param
.modinfo
__ksymtab_gpl
__ksymtab_strings
.rodata
.exit.text
.init.text
.text
.strtab
.symtab
.shstrtab
.bssmodule 初始需要的 code 和 data
程式本體 ( 組語 )
module 卸載需要的 code 和 data
常數 , 唯讀
開放給 kernel 裡 GPL 相容部份使用 ( 字串 )
開放給 kernel 裡 GPL 相容部份使用 (struct)
modinfo 可以看到的資訊
此 module 能接受的參數的資訊
有初值的變數 , 可讀寫
無初值的變數 , 可讀寫
struct module
kernel_symbol
value
name
module
state init_size
list core_size
name init_text_size
syms core_text_size
crcs arch
num_syms taints
extable source_list
module_init waiter
module_core exit
num_gpl_syms symtab
gpl_syms num_symtab
gpl_crcs strtab
gpl_future_syms sect_attrs
num_exentries percpu
gpl_future_crcs notes_attrs
init target_list
num_gpl_future_syms args
0 1 2 3 4 5 6 7 8 9
0 a d d 0 m a i 0 e
0tix
0
10
20
( 我猜類似這樣 )
27
0 1 2 3 4 5 6 7 8 9
0 . t e x t 0 . d a
t a 0 . r o d a t a
0
0
10
20
0 1 2 3 4 5 6 7 8 9
0 a d d 0 m a i 0 e
0tix
0
10
20
__ksymtab_gpl
__ksymtab_strings
.rodata
.exit.text
.init.text
.text
.strtab
.symtab
.shstrtab
.bssmodule 初始需要的 code 和 data
程式本體 ( 組語 )
module 卸載需要的 code 和 data
常數 , 唯讀
開放給 kernel 裡 GPL 相容部份使用 ( 字串 )
開放給 kernel 裡 GPL 相容部份使用 (struct)
無初值的變數 , 可讀寫
section name( 字串 )
struct symbol
symbol name( 字串 )
elf32_sym
st_name
st_value
st_shndx
kernel_symbol
value
name
.data
__param
.modinfo
modinfo 可以看到的資訊
0 1 2 3 4 5 6 7 8 9
0 a d d 0 m a i 0 e
0tix
0
10
20
( 我猜類似這樣 )
28
7.a ELF 介紹
7.b Module 相依性
7.c Module Section
7.d 載入 Module
7.e 卸載 Module
29
0x00000000
executable
so lib
file mapping(ko)
30
50
45
40
35
30
20
15
10
53
52
25
0x00000000
1. 把 module 從 userspace
複製到 kernelspace 的 tmp memory
5
0
31
50
45
40
35
30
20
15
10
53
load_info
hdr
sechdrs
secstrings
strtab
52
25
mod
0x00000000
1. 把 module 從 userspace
複製到 kernelspace 的 tmp memory
2. 建立此 module 的 load info & 設定 mod 指向位置
5
0
module
state init_size
list core_size
name init_text_size
syms core_text_size
crcs arch
num_syms taints
extable source_list
module_init waiter
module_core exit
num_gpl_syms symtab
gpl_syms num_symtab
gpl_crcs strtab
gpl_future_syms sect_attrs
num_exentries percpu
gpl_future_crcs notes_attrs
init target_list
num_gpl_future_syms args
32
50
45
40
35
30
20
15
10
53
load_info
hdr
sechdrs
secstrings
strtab
52
25
.modinfo
mod
0x00000000
1. 把 module 從 userspace
複製到 kernelspace 的 tmp memory
2. 建立此 module 的 load info & 設定 mod 指向位置
3. 比對 kernel 和 module 的 version magic number
5
0
33
50
45
40
35
30
20
15
10
53
load_info
hdr
sechdrs
secstrings
strtab
52
25
.modinfo
mod
0x00000000
1. 把 module 從 userspace
複製到 kernelspace 的 tmp memory
2. 建立此 module 的 load info & 設定 mod 指向位置
3. 比對 kernel 和 module 的 version magic number
5
0
1. 有無啟用 SMP
2. 有無啟用 preemption
3. 使用的 compiler 版本
4. arch.-specific 常數
34
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
1. 把 module 從 userspace
複製到 kernelspace 的 tmp memory
2. 建立此 module 的 load info & 設定 mod 指向位置
3. 比對 kernel 和 module 的 version magic number
4. 分類哪些 section 組成 final memory 的 core 和 init
50
45
40
35
20
15
10
52
25
5
0
30
53
35
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
50
45
40
35
20
15
10
52
25
5
0
30
53
init
core
5. 分配 final memory 空間
36
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
5. 分配 final memory 空間 & 複製
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
rodata
data
core
.bss
37
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
rodata
data
core
.bss
38
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
39
modules
.gnu...this_module
.gnu...this_module
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
mod
.init.text text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
40
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
mod
.init.text text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
41
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
.init.text text
init
.strtab
.symtab(resolved)
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
elf32_sym
st_name
st_value
st_shndx
kernel_symbol
value
name
如果找到 symbol
就把它的 value 複製過來
這就是”解析”
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
.init.text text
init
.strtab
.symtab(resolved)
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
module
source_list
target_list
iptable_nat
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
nf_conntrack
module
source_list
target_list
如果從別的 module 解析 symbol
就和該 module 建立使用關係
43
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8.
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
44
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section
50
45
40
35
52
53
.init.text text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
20
10
25
5
30
15
0
45
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
50
45
40
35
20
10
52
25
5
30
53
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.bss
15
0
46
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
.rel.text
47
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
elf32_rel
r_offset
r_info
.rel.text
elf32_rel
r_offset
r_info
elf32_rel
r_offset
r_info
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
.text
48
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
elf32_rel
r_offset
r_info
.rel.text
elf32_rel
r_offset
r_info
elf32_rel
r_offset
r_info
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
.text
r_offset
49
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
elf32_rel
r_offset
r_info
.rel.text
elf32_rel
r_offset
r_info
elf32_rel
r_offset
r_info
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
.text
r_offset
50
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
9.
50
45
40
35
52
53
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.bss
20
10
25
5
30
15
0
51
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
50
45
40
35
52
53
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
20
10
25
5
30
15
0
52
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
.gnu...this_module
.gnu...this_module
53
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
11. 檢查整個系統有無重複 symbol
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
54
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
11. 檢查整個系統有無重複 symbol
12. 把 module 串進系統
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
55
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
11. 檢查整個系統有無重複 symbol
12. 把 module 串進系統
13. 剖析 module argument( 無圖 )
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
56
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
14. 釋放 tmp memory
50
45
40
35
52
53
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
20
10
25
5
30
15
0
57
mod
0x00000000
14. 釋放 tmp memory
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
58
mod
0x00000000
14. 釋放 tmp memory
15. 初始化 module
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
59
mod
0x00000000
14. 釋放 tmp memory
15. 初始化 module & 釋放 final memory 的 init 部份
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
60
7.a ELF 介紹
7.b Module 相依性
7.c Module Section
7.d 載入 Module
7.e 卸載 Module
61
modules
.gnu...this_module
.gnu...this_module
0x00000000
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
1. 確認 module 是否在系統裡
62
modules
.gnu...this_module
.gnu...this_module
0x00000000
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
63
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
這是同一個
64
modules
.gnu...this_module
.gnu...this_module
0x00000000
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
65
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
66
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
5. 移除使用關係
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
67
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
5. 移除使用關係 & 資料結構
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
nf_conntrack
module
source_list
target_list
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
68
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
5. 移除使用關係 & 資料結構 & 釋放 module
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
69
End

ch7-pv1-modules