如何解决“LLVM ERROR: Tried to execute an unknown external function”错误
LLVM lli 执行外部归档函数报错排查
问题场景
我正在编写LLVM Pass,将归档文件/build/rtlib/mylib.a中定义的指令插入LLVM IR,执行时通过lli解释器调用这些指令。
执行命令:
lli-8 -extra-archive="/build/rtlib/mylib.a" -force-interpreter input.ll
对应的IR代码片段:
define protected i32 @main(i32, i8**) #0 !dbg !28 { entry: call void @func_entry(i32 16385, i32 1) . . . declare void @func_entry(i32, i32)
执行时触发错误:LLVM ERROR: Tried to execute an unknown external function(该函数已在IR文件末尾声明)
排查与解决方法
验证归档库中是否存在目标函数
用nm命令检查mylib.a里是否包含func_entry:nm /build/rtlib/mylib.a | grep func_entry若输出为空,说明库中未包含该函数,需确认编译归档时是否正确将包含
func_entry的目标文件打包进去。确保函数签名完全匹配
IR中的函数声明必须和库中函数的实际签名完全一致:- 如果库是C编译的,函数会被名字修饰,IR中要么使用修饰后的全名,要么在C代码中用
extern "C"修饰func_entry,避免名字混淆。 - 检查参数类型、返回值类型是否完全对应,比如不要出现IR声明是
i32参数,实际函数是int64_t的情况。
- 如果库是C编译的,函数会被名字修饰,IR中要么使用修饰后的全名,要么在C代码中用
确认归档路径正确性
检查-extra-archive指定的路径是否为有效绝对路径,通过ls /build/rtlib/mylib.a验证文件是否存在。尝试关闭强制解释器模式
去掉-force-interpreter参数,用JIT模式执行,排除解释器的特殊限制:lli-8 -extra-archive="/build/rtlib/mylib.a" input.ll检查LLVM版本兼容性
确保编译mylib.a所用的Clang/LLVM版本和lli-8一致,版本不匹配可能导致ABI兼容性问题,无法识别函数。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

