linux kernel编译 undefined reference to `__ae

在32位CPU上,Linux不提供64位除法的快速实现,导致编译时出现undefined reference错误。为避免慢速代码,需要使用特定的库函数来执行64位除法操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题代码

 ktime_t calltime, delta, rettime;
 unsigned long long duration;

 calltime = ktime_get();


/*获取当前时间*/
rettime = ktime_get();
/*计算时间差 ktime_sub(A,B) 计算A-B的时间差 返回纳秒*/
delta = ktime_sub(rettime,calltime);
/*转换成微秒*/
duration = (unsigned long long) ktime_to_ns(delta) >> 10;
printk("[%s] running %lld  usecs %d ms at %d\n",__FUNCTION__, duration,(unsigned int)(duration/1000),__LINE__);

 

编译出错

/rk3288_pad/kernel/drivers/input/sensors/sensor-dev.c:505: undefined reference to `__aeabi_uldivmod'
/data/weiqifa/rk3288_pad/kernel/drivers/input/sensors/sensor-dev.c:529: undefined reference to `__aeabi_uldivmod'
Makefile:997: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1
### 链接错误分析 链接错误通常发生在编译阶段之后,在链接器尝试解析符号的过程中出现问题。具体到 `undefined reference to '__imp_iob_func'` 的情况,这通常是由于缺少某些必要的库文件或者不正确的链接顺序引起的。 #### 可能的原因 1. **标准C运行时库缺失** GCC 和 MinGW 编译器依赖于特定的标准 C 运行时库来提供基础功能支持。如果这些库未被正确链接,则可能会导致类似的链接错误。例如,`__imp_iob_func` 是与标准 I/O 流相关的函数之一[^1]。 2. **链接选项配置不当** 如果在构建过程中遗漏了 `-l` 参数指定的必要库(如 `libmsvcrt.a` 或其他相关库),则可能导致无法找到所需的符号定义[^3]。 3. **重复定义问题** 类似于 LNK2005 错误的情况,可能存在多个目标文件中对同一全局变量或函数进行了重复定义。尽管当前问题是关于 `__imp_iob_func` 而非自定义变量,但仍需注意是否有冲突的头文件引入或其他代码污染[^2]。 --- ### 解决方案 以下是几种常见的解决方案: #### 方法一:确保正确链接标准库 确认命令行参数中包含了适当的标准库链接指令。可以尝试显式添加以下标志: ```bash -lmingw32 -lmoldname -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 ``` 完整的编译/链接命令示例: ```bash gcc -o output.exe main.c -lmingw32 -lmoldname -lkernel32 ... ``` 此方法适用于大多数基于 Windows 平台的应用程序开发环境下的静态或动态链接需求[^3]。 #### 方法二:更新工具链版本 有时旧版的 MinGW 工具链可能存在问题,建议升级至最新稳定版本。新版本修复了许多已知缺陷并改进兼容性处理机制。下载地址可以从官方站点获取。 #### 方法三:调整源码实现方式 如果是因项目结构复杂而导致难以定位的具体原因,考虑重构部分逻辑减少对外部接口调用次数;另外也可以通过条件编译技术屏蔽掉不必要的模块加载操作从而规避潜在风险点。 #### 示例修正后的Makefile片段 假设存在如下简单的 Makefile 文件内容用于演示如何设置额外的链接项: ```makefile CC=gcc LD=$(CC) CFLAGS=-Wall -O2 LDFLAGS=-static-libgcc -Wl,-Bstatic -lstdc++ -lpthread -ldl all: program program: main.o helper.o $(LD) $^ -o $@ $(LDFLAGS) ``` 以上脚本中的关键在于明确了哪些外部资源需要参与最终产物组装过程之中。 --- ### 总结 综上所述,“undefined reference to `__imp_iob_func`”这类错误主要源于以下几个方面的问题——要么是没有成功关联相应的共享对象(.so)/DLL(.dll),或者是内部数据描述符表初始化失败所致。按照前述指导逐一排查应当能够有效缓解乃至彻底消除此类现象的发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值