編譯的核心載入驅動,提示failed (Exec format error)
阿新 • • 發佈:2019-02-08
我用的是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);