insmod lcd.ko:module has no symbols (stripped?)【续】

本文介绍了一个Buildroot构建过程中的问题及其解决方案。主要关注如何避免在生成的.so和.ko文件中移除符号表,这对于调试非常重要。

针对上次(20090404)的情况,自己检查一番:(花了2个半天。。。那个汗啊)

注意查看此Makefile文件的执行情况(只需要打印这些数据信息(不执行命令)1):

打开/tmp/Makefile,根据前面的打印信息:

先定位第一行:/sbin/ldconfig

/tmp/Makefile中仔细搜素"/sbin/ldconfig",得到:

 

 

注意这行信息:

-@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;

 先确定$(STRIP)的值,在调试目标文件/tmp/Makefile中搜索STRIP,得到

 

即所要找的"去掉符号表"!!!  这句话的含义是:  在目标文件夹中搜索 类型为f 并且文件掩码含有可执行位的文件,注意这里的“可执行位”是指“只要有都匹配这种格式”,去掉符号表

-perm +111的含义是(参考man find)

perm +mode:Any of the permission bits mode are set for the file.

 

然后找到命令定义所在文件,注意看这行信息

打开文件 target/jffs2/jffs2root.mk,定位到line 43find

果然有:

 

 

好了大展拳脚吧!!!嘿嘿 改上面的一行为

 

这样我们生成的*.so,*.ko不管文件掩码为什么都不会被去掉符号表了!

哈哈哈

 

 

 

 

1:

参阅http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-09.html

-p

--print-data-base

命令执行之前,打印出make读取的Makefile的所有数据(包括规则和变量的值),同时打印出make的版本信息。如果只需要打印这些数据信息(不执行命令)可以使用“make -qp”命令。查看make执行

 

前的预设规则和变量,可使用命令“make p -f /dev/null”。

 

### 错误原因分析 `insmod: ERROR: could not insert module demo.ko: Invalid module format` 是在尝试加载内核模块时常见的错误,通常表示模块的格式与当前运行的内核不兼容。该错误可能由以下几种原因引起: - 模块编译时使用的内核头文件版本与当前运行的内核版本不一致; - 模块未正确编译,导致生成的 `.ko` 文件损坏或不完整; - 内核配置不兼容,例如未启用模块支持或模块签名验证失败; - 模块依赖的符号未在内核中找到,导致模块验证失败。 ### 检查内核版本一致性 模块必须使用与当前运行内核版本一致的头文件进行编译。可以通过以下命令查看当前内核版本: ```bash uname -r ``` 确保使用的 `Makefile` 中引用了正确的内核构建路径: ```makefile make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules ``` 如果当前系统中安装了多个内核版本,应确认是否选择了正确的内核源码路径进行编译[^1]。 ### 验证模块文件完整性 使用 `modinfo` 命令可以检查 `.ko` 文件的基本信息,包括模块签名、内核版本依赖等: ```bash modinfo demo.ko ``` 如果输出中包含 `vermagic` 字段,应与当前内核的版本和配置匹配。例如: ``` vermagic: 5.15.0-76-generic SMP mod_unload modversions ``` 如果不匹配,说明模块是为其他内核版本编译的,需重新编译[^1]。 ### 检查内核模块支持 确保当前内核启用了模块支持。可以通过以下命令查看是否启用了 `CONFIG_MODULES` 配置选项: ```bash grep CONFIG_MODULES /boot/config-$(uname -r) ``` 若输出为 `CONFIG_MODULES=y`,则表示模块支持已启用。否则,需要重新配置内核以启用模块支持[^1]。 ### 使用 `dmesg` 查看详细错误日志 在尝试加载模块失败后,使用 `dmesg` 查看内核日志,可以获取更详细的错误信息: ```bash sudo insmod demo.ko dmesg | tail ``` 日志中可能包含模块加载失败的具体原因,例如符号缺失、版本不匹配等。例如: ``` demo: version magic '5.15.0-76-generic SMP mod_unload modversions ' should be '5.15.0-72-generic SMP mod_unload modversions ' ``` 这表明模块是为另一个内核版本编译的,需重新编译以匹配当前内核版本[^1]。 ### 使用 `modprobe` 替代 `insmod` 加载模块 `modprobe` 会自动处理模块依赖关系,更适合用于加载模块。尝试使用以下命令加载模块: ```bash sudo modprobe -v demo ``` 如果模块依赖未满足,`modprobe` 会提示缺少的依赖模块。此时可使用 `depmod` 更新模块依赖关系: ```bash sudo depmod -a ``` ### 示例 Makefile 确保模块是通过内核构建系统正确编译的。以下是一个标准的内核模块 `Makefile` 示例: ```makefile obj-m += demo.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean ``` 执行编译命令后,应生成 `demo.ko` 文件。确认文件存在并使用 `modinfo` 验证其内容[^1]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值