编译linux-2.6.29内核,报错解决方法

在编译linux-2.6.29内核版本过程,依次出现如下问题,记录解决方法。

报错提示1:

解决:
执行:vi /home/wangz/rootfs/linux-2.6.29/kernel/timeconst.pl文件,执行:373跳转至373行,将!defined(@val)改为!(@val) 即可,如下 

报错提示:2:

解决:
由于旧编译器可能是用OABI的,而配置内核时又选择了使用EABI的,修改内核配置(make menuconfig)选项:
Kernel Features ---->Use the ARM EABIto compile the kernel 为 no,重新生成.config文件(其中.config默认为隐藏文件,用ls -a可以查看到)

报错提示3:

解决:
如果使用的是Ubuntu 9.10及以上版本,可以使用下面的命令安装mkimage,执行:#apt-get install uboot-mkimage。我在Ubuntu16.04上测试行不通,

然后执行:apt-get install u-boot-tools,安装成功后重新编译内核,执行:

make uImage ARCH=arm CROSS_COMPILE=arm-linux-

最后编译得到内核uImage镜像如下:

 

编译内核模块时出现问题:

执行:make modules ARCH=arm CROSS_COMPILE=arm-linux-

报错提示1:

解决:
implicit declaration of function `dma_cache_sync'表示隐式声明错误,可能有几个原因:
1   没有把函数所在的c文件生成.o目标文件
2   在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明
/home/wangz/rootfs/linux-2.6.29//arch\arm\include\asm\dma-mapping.h下没有这个函数声明,但有如下注释:
/*
* Dummy noncoherent implementation.  We don't provide a dma_cache_sync
* function so drivers using this API are highlighted with build warnings.
*/
dma_cache_sync( )没有申明却被调用
, 这里直接把它注释掉好了,执行
vi /home/wangz/rootfs/linux-2.6.29/drivers/scsi/advansys.c,查找dma_cache_sync( )函数调用部分改为如下:

报错提示2:

执行:
make menuconfig
然后在配置中设置device drivers -->network device support-->enthernet (10 or 100Mbit)-->Sun GEM support选项为 no 即可解决上述问题。

 

### 解决 `class_create` 和 `THIS_MODULE` 报错方法 当在较新的Linux内核版本中使用 `class_create()` 函数并传入 `THIS_MODULE` 参数时遇到编译错误,这通常是因为内核API的变化所致。自2.6.29版起,内核更新了设备模型接口,引入了新函数来替代旧有的实现方式。 对于现代内核版本,在创建类对象时应采用如下做法: - 使用 `class_create()` 而不是过时的 `class_device_create()` - 确认已包含必要的头文件 `<linux/device.h>` 以便访问最新的定义和声明[^1] 具体来说,如果尝试传递宏 `THIS_MODULE` 给 `class_create()` 并遭遇失败,则可能是由于参数列表不匹配引起的。此时应当检查所使用的内核文档以及源码中的实际签名,以确保调用形式正确无误。根据 `/include/linux/device.h` 中的内容显示,`class_create()` 的原型确实接受一个指向模块结构体指针作为其第一个参数,因此直接提供 `THIS_MODULE` 是合理的操作[^2]。 然而,考虑到不同发行版可能存在的差异性,建议采取以下措施进一步排查问题根源: - 核实当前开发环境下的确切内核版本号 - 查阅对应版本的具体手册页或官方指南获取最权威的信息指导 - 尝试简化测试案例重现该现象,并通过调试工具定位具体的语法或语义层面的问题所在 下面给出一段示范性的代码片段用于展示正确的 `class_create` 应用场景: ```c #include <linux/module.h> #include <linux/init.h> #include <linux/device.h> static struct class *my_class; static int __init my_module_init(void){ printk(KERN_INFO "Initializing module\n"); // 正确的方式:指定所有者为 THIS_MODULE my_class = class_create(THIS_MODULE, "example"); if (IS_ERR(my_class)) { pr_err("Failed to create class\n"); return PTR_ERR(my_class); } return 0; } static void __exit my_module_exit(void){ printk(KERN_INFO "Cleaning up module\n"); if (!IS_ERR_OR_NULL(my_class)) class_destroy(my_class); } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL"); ``` 上述实例展示了如何安全地初始化一个新的类别,并且包含了清理逻辑以防资源泄露。值得注意的是,这里假设读者已经熟悉基本的Makefile配置和其他辅助设置过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值