如何在kernel模块中使用已经编译好的obj文件

这也是一时心血来潮,觉得好玩。 在Document/kbuild/modules.txt中看到这么一段


--- 3.3 Binary Blobs

Some external modules need to include an object file as a blob.
kbuild has support for this, but requires the blob file to be
named <filename>_shipped. When the kbuild rules kick in, a copy
of <filename>_shipped is created with _shipped stripped off,
giving us <filename>. This shortened filename can be used in
the assignment to the module.

Throughout this section, 8123_bin.o_shipped has been used to
build the kernel module 8123.ko; it has been included as
8123_bin.o.

8123-y := 8123_if.o 8123_pci.o 8123_bin.o

Although there is no distinction between the ordinary source
files and the binary file, kbuild will pick up different rules
when creating the object file for the module.


想着好玩,就自己试了一下,开始不成功,后来在高手的帮助下终于成功了。


1。 创建自己的obj文件

我最开始使用 gcc -c ex_obj.c -o ex_obj.o_shipped 来做的,结果链接后不能正常工作。

原来是一定要放在编译kernel的环境中编译这个obj。网上高手说了 要这么写


ifneq ($(KERNELRELEASE),)
obj-y := xxxx.o #your obj files goes here. 关键在这里,用obj-y 来指定要编译的,然后这个过程就在编译的时候停了,不会继续链接。
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD)

endif

clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
$(CC) $(CFLAGS) -M *.c > .depend


ifeq (.depend,$(wildcard .depend))
include .depend
endif


编译成功后,将这个拷贝到需要链接的模块目录。

记住要添加_shipped后缀


2。 然后在需要这个obj的模块中添加

scull-y := main.o pipe.o access.o ex_obj.o


然后在源代码中调用相应的函数,ok,可以了。

不过貌似没有啥实际用处。 :)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值