16 驅動模組的符號表與符號匯出

2021-08-02 05:38:41 字數 2615 閱讀 1822

檢視elf檔案的資訊

readelf test.ko -a

ko檔案組成:

1). elf檔案頭

elf header:

magic: 7f 45

4c 46

0101

0100

0000

0000

0000

0000

class: elf32

data: 2

's complement, little endian

version: 1 (current)

os/abi: unix - system v

...2). 記錄各個段的資訊

section headers:

[nr] name type addr off size es *** lk inf al

[ 0] null 00000000

000000

000000000

00[ 1] .text progbits 00000000

000034

000000

00 ax 001

[ 2] .init.text progbits 00000000

000034

00004c 00 ax 004

...3). 各個段的具體內容

4). symbol table

symbol table '.symtab' contains 64 entries:

num: value size type bind vis ndx name

...56: 00000000

0 notype global

default und gpio_free

57: 00000000

76 func global

default

2 init_module

58: 00000000

0 notype global

default und gpio_direction_output

59: 00000000

0 notype global

default und printk

60: 00000000

0 notype global

default und __gpio_set_value

61: 00000000

0 notype global

default und gpio_request

//注意 und標識的意思是此驅動模組裡使用了這些函式,但這些函式的函式體並不在驅動模組裡的,所以它們的函式位址還不確定的,現只存為0位址. 這些und標識函式會由核心在載入驅動模組時在核心符號表裡查詢到它們的函式位址,並替換驅動模組裡的函式位址.

//注意,und標識的函式在核心符號表裡都是」t」, 表示是全域性函式. 也就是說只有全域性函式,核心才會幫我們把相應的函式位址轉換好.

///

驅動模組裡預設情況下不管是函式還是全域性變數都是作區域性使用(相當於在函式/變數名前加了」static」).

如果需要作為全域性使用,需要使用匯出符號」export_symbol(函式名/變數)」,宣告函式/變數為全域性使用.

如實現乙個核心裡的全域性函式」myfunc」,在其它驅動模組裡呼叫.

myfunc.c:

#include 

#include

void myfunc(char *str)

export_symbol(myfunc);

module_license("gpl");

編譯載入模組後,可以核心符號表裡檢視到myfunc函式:

cat /proc/kallsyms | grep myfunc

輸出的內容:

bf081000 t myfunc [myfunc]

呼叫myfunc的test模組:

test.c:

#include 

#include

extern

void myfunc(char *);

static

int __init test_init(void)

static

void __exit test_exit(void)

module_init(test_init);

module_exit(test_exit);

module_license("gpl");

編譯後,載入和解除安裝test驅動模組時都會呼叫到myfunc函式.

//需注意載入驅動模組的順序, 如果myfunc驅動模組不先載入,則test模組會載入不成功.

C 符號表匯出

編譯符號表匯出示例 使用gcc編譯鏈結引數 version script 控制動態符號表,如想 使用鏈結引數 retain symbols file 控制靜態符號表,version script 控制動態符號表,後面都是接含有匯出符號的檔案的名字。這兩個引數在移植windows下的動態庫很有用,wi...

未解決符號表,匯出符號表和位址重定向表

讓我們總結一下 編譯器把乙個cpp編譯為目標檔案的時候,除了要在目標檔案裡寫入cpp裡包含的資料和 還要至少提供3個表 未解決符號表,匯出符號表和位址重定向表。未解決符號表提供了所有在該編譯單元裡引用但是定義並不在本編譯單元裡的符號及其出現的位址。匯出符號表提供了本編譯單元具有定義,並且願意提供給其...

符號表的作用

在編譯程式中符號表用來存放語言程式 現的有關識別符號的屬性資訊,這些資訊集中反映了識別符號的語義特徵屬性。在詞法分析及語法在分析過程中不斷積累和更新表中的資訊,並在詞法分析到 生成的各階段,按各自的需要從表中獲取不同的屬性資訊。不論編譯策略是否分趟,符號表的作用和地位是完全一致的 編譯程式掃瞄說明部...