Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
29285 Discussions

Linking errors when using memory sanitizer in fortran project

ogmundur
Novice
4,180 Views

When I use the check uninit option in a large, mixed language (fortran and C) project with the new ifx driver I get a huge amount of the following linking errors:

 

undefined reference to `__msan_chain_origin'

 

with references to numerous other routines from the memory sanitizer all beginning with __msan. If I turn the uninit check off, the project compiles and links successfully.

I am using ifx version 2023.2.0. I am using CMake, which automatically selects ifx to link the executable.

Should I be passing further options to the linker, so that it finds the memory sanitzer routines?

1 Solution
Barbara_P_Intel
Employee
4,161 Views

When you compile with -check uninit (or -check all) you also need to link with that compiler option.

 

View solution in original post

6 Replies
Barbara_P_Intel
Employee
4,162 Views

When you compile with -check uninit (or -check all) you also need to link with that compiler option.

 

ogmundur
Novice
4,119 Views
0 Kudos
dkokron_wcoss2
Beginner
1,685 Views

What are my options for a mixed language (fortran and c++) application where some fortran code is compiled (ifx) with "-check uninit" but the application is linked with icpx (which does not recognize the -check option )?  I'm on Linux using OneAPI-2024.2.1.

0 Kudos
Mark_Lewy
Valued Contributor I
1,390 Views

Use "-fsanitize=memory" when compiling C/C++ to be used with "-check uninit" from ifx.

0 Kudos
jimdempseyatthecove
Honored Contributor III
1,081 Views

If your C++ code is the main of the program, then remember to insert early into your main(...) 

int argc;
char **argv;
void for_rtl_init_ (int *, char **);
for_rtl_init_ (&argc, argv);

And at the end of the program

int io_status;
int for_rtl_finish_ ( );
io_status = for_rtl_finish_ ( );

It is probably best practice in C++ to make a class or struct with the ctor doing the init and the dtor doing the finish.

Jim Dempsey

0 Kudos
dkokron_wcoss2
Beginner
1,327 Views

Mark,

I will try that and report results back here.

Dan

0 Kudos
Reply