1. 程式人生 > >編譯的核心載入驅動,提示failed (Exec format error)

編譯的核心載入驅動,提示failed (Exec format error)

我用的是xt800,由於要使用insmod這些命令,所以首先就是獲得手機的root許可權(adb shell獲得root許可權)

我看了手機,我的核心是2.6.29-omap1,我就上linux上面去下了一個這個核心。然後是配置,如果這幾項不
配置直接將hello.ko載入上去會出現的錯誤是insmod: init_module '/data/hello1.ko' failed (Exec format error),
用dmesg看發現使版本不一樣,我的要求的是2.6.29-omap1 preempt mod_unload ARMv7,所以在配置的時候主要就是
要改一下 preempt mod_unload ARMv7,我用的使make menuconfig配置的,選擇system type,然後選擇

arm ltd integrator family   ,然後把後面有個support arm v7  processor的選上,在kernel feature上把preempt
選上,把enable loadable module support選上,然後進入選擇module unloading,這樣在make寫的hello模組
就能通過剛才的問題了,但是這時候載入上去會出現mcount(或者__gnu_mcount_nc)unknown symbol,這個使
手機使發行的版本沒有調式的符號,所以你編譯的時候也不要引人用於除錯的資訊,我在重新make menuconfig原始碼,
把所有關於調式的資訊都給關了,這個錯誤也通過了。這時候能夠正常載入和解除安裝hello模組了,但是發現沒有執行。

比如裡面的printk沒有列印任何資訊,開始以為使printk在哪裡搞錯了,但是一直沒有找到相關的問題。後面我下載了
android的2.6.29的核心下來,由於這個不是omap1的,所以在版本的位置改了一下(好像說可以去掉版本檢查在載入
模組的時候,但是我不知道,所以就改了以下)然後再像上面說的那樣做了一遍,再用dmesg時,看到了hello  world
#include <linux/init.h>  
 #include <linux/module.h>  
#include <linux/kernel.h>
 MODULE_LICENSE("GPL");  
 static int __init hello_init(void)  

 {  
     printk("<0>Hello, world\n");  
     return 0;  
 }  
 static void __exit hello_exit(void)  
 {  
     printk("<0>Goodbye, cruel world\n");  
 }  
module_init(hello_init);  
module_exit(hello_exit);