13

単純なカーネル モジュールを作成しようとしています。メッセージをdmesgに出力しようとしていますが、取得し続けます

insmod: Android で init_module 'hello.ko' が失敗しました (Exec フォーマット エラー)

後: dmesg: 不明な再配置: 27

#include <linux/module.h>
#include <linux/kdb.h>
int init_module(void)
{
    printk(KERN_ALERT "Hello world!\n");
    return 1;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}
MODULE_AUTHOR("Robert P. J. Day");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_VERSION("2:1.0") ;
MODULE_DESCRIPTION("You have to start somewhere.");

メイクファイル

    obj-m +=hello.o


KERNELDIR ?= ~/android/kernel/common
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
CROSS_COMPILE=~/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-

ARCH=arm
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules

clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
rm *.symvers

誰かが理由を知っていますか?そして、それを機能させる方法は?

readelf を実行した後、コンパイル時に再配置セクションが間違った方向を指していることがわかりました。

Offset     Info    Type            Sym.Value  Sym. Name
00000008  0000171b R_ARM_PLT32       00000000   printk

実際には次のようにする必要があります。

Offset     Info    Type            Sym.Value  Sym. Name
00000008  0000171c R_ARM_CALL       00000000   printk

誰かが推測/知ることができますか? これまで私を助けてくれた@Chris Strattonに感謝します。


readelf を実行した後、コンパイル時に再配置セクションが間違った方向を指していることがわかりました。

Offset     Info    Type            Sym.Value  Sym. Name
00000008  0000171b R_ARM_PLT32       00000000   printk

実際には次のようにする必要があります。

Offset     Info    Type            Sym.Value  Sym. Name
00000008  0000171c R_ARM_CALL       00000000   printk

誰かが推測/知ることができますか? これまで私を助けてくれた@Chris Strattonに感謝します。

4

2 に答える 2

10

私が使用しなければならなかったことがわかりました

make CFLAGS_MODULE=-fno-pic
于 2012-07-25T15:12:12.620 に答える
0

ありがとう、-fno-pic で私の dlkm も動作するようになりました。「本当の」仕事へ…

ところで、シェルで ARCH、SUBARCH、CROSS_COMPILE、KERNELDIR をエクスポートできるので、Makefile は非常にシンプルになります。これにより、KERNELDIR を適切に設定することで、ネイティブまたはターゲット プラットフォーム用の dlkm をより簡単に構築することもできます (ネイティブには ARCH、SUBARCH、または CROSS_COMPILE 変数は必要ありません)。

obj-m += hello.o

すべて: make -C $(KERNELDIR) M=$(PWD) モジュール

于 2013-01-25T02:51:59.870 に答える