I am building my application using OpenMPI (built with LLVM) and few other external libraries including netcdf-fortran, BLAS and LAPACK. The files compile without any problem, but in the last stage where all the object files are being linked I get the following error
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)
The error message indicates that lines of 0 and 26 in /home/rangke/archive/gsam1.4/SRC/BUILDINGS/buildings_rad_walls.f90 references _rad8_, but this file does not contain nor any of my files contain a variable named _rad_8_. Line 0 in the file is a comment, and the line 26 contains the following
if(doshadows.and.flag_sunny) then
which has nothing to do with the _rad_8_. doshadows and flag_sunny are logical data type, not an integer or real or double data type.
The following is the linking part of my makefile content.
LD = mpifort
LDFLAGS = -${ncf_dir}/lib -lnetcdff -lblas -llapack
...
...
...
$(LD) -o $@ $(OBJS) $(LDFLAGS)
where ${ncf_dir} is the netcdf-fortran directory.
I am suspecting that the variable _rad_8_ has to do with BLAS or LAPACK, specifically something with data type precision. I have tried different BLAS and LAPACK library, such as BLIS and libflame, but to no avail. Does anyone have any idea what is happening here? Any idea would help.
More clues.
What I have found out is that when I put -fdefault-real-8 flag so that every real is treated as 8 byte, I get the following error message
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....
This error mesage contains the _rad_8_ in question, but I am not sure where it is from. It seems like this error message is for the /home/rangke/archive/gsam1.4/SRC/zero.f90, but according to the make output it is produced during the compilation of rad.o which is different file.
Where is this
%struct_rad_8_ = type < { [4 x i8] } >
from? I can confidently say that it is not part of my application, it is not in /home/rangke/archive/gsam1.4/SRC/zero.f90 or in the rad.f90 file.
More more clues
I found that _rad_8_ comes from LLVM IR (bit code). I have compiled the same code on AMD 4750U and AMD EPYC 7513, and they produce different LLVM IR codes. In short EPYC 7513 produces %struct_rad_8_ = type < { [4 x i8] } >, and eventually leads to successful linking process of my application, while AMD 4750U does not. Why is this happening? Is this problem inherent to the AMD CPU generations? Or is there a way to force AMD 4750U to gerenate the %struct_rad_8_ = type < { [4 x i8] } > part? I have listed the detailed LLVM IR issue in the AMD forum : https://community.amd.com/t5/processors/different-llvm-ir-content-for-the-same-code-on-different-zen/td-p/610733
rad_8_symbol in the LLVM runtime so this is pretty suspicious. make sure you useimplicit noneeverywhere to make sure the compiler can spot this kind of typo.implicit noneon every file. Though, I am getting the same error. I am trying to gernerate some more detailed debug message.-gflag does not seem to work at all. Any suggestions?/home/rangke/archive/gsam1.4/SRC/BUILDINGS/buildings_rad_walls.f90contains? just in case, try removing the object file and runmakeagain in order to make sure the file is needed and was rebuilt.-lnetcdff -lnetcdfand link with lapack first-llapack -lblas. this is very likely unrelated to this issue though.