2011-12-07 79 views
1

我有一個內核模塊需要訪問內核的_stext_etext符號。出於某種原因,儘管其內核具有這些符號定義(/proc/kallsyms),每當我打開我的模塊,我得到2.6 Linux內核中的_stext和_etext - 爲什麼我的內核模塊不能鏈接到它們?

mymodule: Unknown symbol _etext (err 0) 
mymodule: Unknown symbol _stext (err 0) 

我沒有運行一個被感染的內核,一切都在模塊中抄小路鏈接OK 。鏈接到_stext_etext是否有模塊或許可證限制?在內核中是否有替代定義可用於代碼存儲器的開始和結束?

更新:

我期待在內核源代碼,並在kallsyms.c,有這樣的:

static int read_symbol_tr(const char *sym, unsigned long long addr) 
{ 
size_t i; 
struct text_range *tr; 

for (i = 0; i < ARRAY_SIZE(text_ranges); ++i) { 
    tr = &text_ranges[i]; 

    if (strcmp(sym, tr->stext) == 0) { 
     tr->start = addr; 
     return 0; 
    } else if (strcmp(sym, tr->etext) == 0) { 
     tr->end = addr; 
     return 0; 
    } 
} 

return 1; 
} 

這是否意味着_etext_stext條目我看到的是/proc/kallsyms假的符號,內核模塊不能實際鏈接到?

回答

1

內核模塊鏈接器只會鏈接已通過附加機制「導出」的符號:符號必須以EXPORT_SYMBOL()EXPORT_SYMBOL_GPL()導出。 (_GPL變體表示內核開發人員標記了內部接口,因此僅適用於GPL許可代碼。)我無法在我的內核源中找到_stext_etext的導出,所以我不相信它們是可供您使用。

你想完成什麼?

+0

啊 - 是的 - 我開始懷疑。至於我想要完成的工作,我正在使用設備NAND中其他人的2.6.37內核。對於我正在做的一些工作,我需要oprofile。他們沒有構建oprofile,也沒有包含像CONFIG_PROFILING這樣的許多依賴配置文件。 –

+0

......我可以用他們的配置參數建立我自己的內核,但是把它放到NAND上似乎是一個問題。我也可以構建一個類似的內核,但是有一個模塊化的oprofile,但是內核中沒有許多依賴的依賴關係,並且依賴關係不易被模塊化。因此,對於我的工作,我一直在搗亂一個Frankenstein創建的oprofile模塊,並且內置了一些必要的依賴項。 –

+0

哇,我的吊,,這只是一個令人沮喪的漫長的路要走,以獲得一些分析數據。祝你好運! – sarnold