amd64主机交叉编译shc到ARM时链接报rpl_malloc未定义错误
交叉编译shc到ARM平台时rpl_malloc/rpl_realloc未定义链接错误修复
问题场景
当前操作链路:
- 主机环境:amd64架构
- 交叉编译工具链:
arm-linux-gnueabi-gcc - 初始配置命令:
CC=arm-linux-gnueabi-gcc ./configure --host=arm - 报错触发时机:执行
make进入程序链接阶段 - 完整报错日志:
Making all in src make[1]: 进入目录"/shc/src" arm-linux-gnueabi-gcc -g -O2 -o shc shc.o shc.o: 在函数"eval_shell"中: /shc/src/shc.c:1010: 对"rpl_malloc"的引用未定义 shc.o: 在函数"make"中: /shc/src/shc.c:1304: 对"rpl_realloc"的引用未定义 collect2: error: ld returned 1 exit status Makefile:326: 目标"shc"的指令执行失败 make[1]: *** [shc] Error 1 Makefile:414: "all-recursive"的指令执行失败 make: *** [all-recursive] Errore 1
报错核心原因
该错误是GNU Autotools构建系统在交叉编译场景下的典型适配问题:
- 本地编译时,configure脚本会在当前主机环境检测系统自带的
malloc/realloc实现是否符合POSIX标准,如果判断实现存在缺陷,就会自动给代码中的malloc/realloc调用加rpl_前缀做重命名,同时生成对应的兼容实现文件完成替换 - 交叉编译时,configure的检测逻辑完全基于x86主机环境运行,不会对目标ARM平台的libc实现做有效校验。当ARM目标平台的libc本身已经提供了标准合规的
malloc/realloc实现时,对应的rpl_malloc/rpl_realloc兼容实现文件不会被纳入编译列表,最终链接阶段就会出现未定义符号的报错。
标准修复步骤
- 清理之前配置生成的残留中间文件,避免旧配置干扰:
- 进入shc源码根目录,执行清理命令:
make distclean
- 进入shc源码根目录,执行清理命令:
- 重新执行configure配置,手动关闭malloc/realloc的兼容替换检测,从根源规避rpl符号生成逻辑:
- 执行配置命令:
CC=arm-linux-gnueabi-gcc ./configure --host=arm ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes - 新增两个参数的作用:直接告知configure脚本,目标平台的
malloc支持传入0参数返回合法指针、realloc支持传入0参数等价于malloc操作,完全符合标准要求,无需额外生成带rpl前缀的兼容实现。
- 执行配置命令:
- 重新触发编译流程:
- 直接运行
make完成构建,即可通过之前报错的链接环节。
- 直接运行
备选快速修改方案:如果已经完成configure配置不想重新执行全流程,可直接手动修改源码目录下的
config.h文件,找到#define malloc rpl_malloc、#define realloc rpl_realloc两行宏定义并注释掉,再重新执行make即可完成链接。
内容的提问来源于stack exchange,提问作者user12227081
相关产品推荐
相关产品推荐

