使用LLVM版OpenMPI编译时链接阶段出现_rad_8_未定义错误求助
链接阶段LLVM IR差异导致的未定义符号问题
问题现象
使用基于LLVM构建的OpenMPI,结合netcdf-fortran、BLAS、LAPACK等外部库编译应用程序时,所有文件编译无问题,但链接阶段出现如下错误:
ld.lld: error: undefined symbol: _rad_8_ >>> referenced by buildings_rad_walls.f90:26 (/home/rangke/archive/gsam1.4/SRC/BUILDINGS/buildings_rad_walls.f90:26) >>> buildings_rad_walls.o:(buildings_rad_walls_) >>> referenced by buildings_rad_walls.f90:0 (/home/rangke/archive/gsam1.4/SRC/BUILDINGS/buildings_rad_walls.f90:0) >>> buildings_rad_walls.o:(buildings_rad_walls_) >>> referenced by buildings_rad_walls.f90:0 (/home/rangke/archive/gsam1.4/SRC/BUILDINGS/buildings_rad_walls.f90:0) >>> buildings_rad_walls.o:(buildings_rad_walls_) >>> referenced 69 more times >>> did you mean: _rad_0_ >>> defined in: rad.o clang-14: error: linker command failed with exit code 1 (use -v to see invocation)
错误提示buildings_rad_walls.f90的第0行和第26行引用了_rad_8_,但该文件及所有源码中均无此变量,第26行仅为if(doshadows.and.flag_sunny) then,仅涉及逻辑类型变量。
Makefile链接配置
链接相关的Makefile内容如下:
LD = mpifort LDFLAGS = -${ncf_dir}/lib -lnetcdff -lblas -llapack ... ... ... $(LD) -o $@ $(OBJS) $(LDFLAGS)
其中${ncf_dir}为netcdf-fortran的安装目录。
排查过程
- 最初怀疑
_rad_8_与BLAS/LAPACK的数据类型精度有关,尝试更换BLIS、libflame等不同库,问题依旧。 - 添加
-fdefault-real-8编译选项(将所有实数视为8字节)时,出现LLVM IR相关错误:
mpifort -c -O3 -Mpreprocess -Mextend -mcmodel=large -march=znver2 -r8 -I/usr/include /home/rangke/archive/gsam1.4/SRC/zero.f90 /tmp/rad-9b513e.ll:36:1: error: invalid use of function-local name %struct_rad_8_ = type < { [4 x i8] } > ^ 1 error generated. make: *** [/home/rangke/archive/gsam1.4/makefile:62: rad.o] Error 1 make: *** Waiting for unfinished jobs....
该错误涉及的_rad_8_并非来自应用源码。
- 最终发现
_rad_8_源于LLVM IR(位码):同一代码在AMD 4750U和AMD EPYC 7513上生成的LLVM IR存在差异,EPYC 7513会生成%struct_rad_8_ = type < { [4 x i8] } >,可成功链接;而4750U则不会生成该内容,导致链接失败。
疑问
- 这是AMD CPU代际的固有问题吗?
- 能否强制AMD 4750U生成对应的LLVM IR内容?
内容的提问来源于stack exchange,提问作者Redshoe
相关产品推荐
相关产品推荐

