mesonbuild / meson

The Meson Build System
http://mesonbuild.com
Apache License 2.0
5.54k stars 1.61k forks source link

Meson does not correctly handle `ifx` when linking to an external library #13052

Open pierre-24 opened 6 months ago

pierre-24 commented 6 months ago

Describe the bug

Meson does not correctly handle ifx when linking to a dynamic library, which results in segmentation fault.

To Reproduce

My goal is to interface this library, written in C but which provides a Fortran interface, with a Fortran code.

To reproduce that bug, you need ifx, the new fortran compiler of Intel (available alongside MKL and others). In fact, when using gfortran, it works correctly ^^

Files from this repository provide a correct minimal example:

# download files
wget https://github.com/pierre-24/libcint-meson/raw/main/for-tests/test_meson_fortran/main.f90
wget https://github.com/pierre-24/libcint-meson/raw/main/for-tests/test_meson_fortran/meson.build
# subproject for the library
mkdir subprojects
wget https://github.com/pierre-24/libcint-meson/releases/download/v0.3.0/libcint_v6.1.2.wrap -O subprojects/libcint.wrap

Now, if I build the project and execute the code, it results in a segmentation fault:

# use intel specifically
export FC=ifx
# build
meson setup _build
meson compile -C _build/
# execute
_build/test_libcint

For example, I get:

$ _build/test_libcint
 SIZEOF(integer)=                     4
ibas=0 (N=1), jbas=0 (N=1)
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image              PC                Routine            Line        Source             
libc.so.6          00007FB00F65C9A0  Unknown               Unknown  Unknown
libcint.so         00007FB00F83C492  cint1e_ovlp_cart_     Unknown  Unknown
test_libcint       0000000000403F77  cint1e_ovlp_cart_           0  main.f90
test_libcint       0000000000403D35  test_libcint               59  main.f90
test_libcint       000000000040377D  Unknown               Unknown  Unknown
libc.so.6          00007FB00F64614A  Unknown               Unknown  Unknown
libc.so.6          00007FB00F64620B  __libc_start_main     Unknown  Unknown
test_libcint       0000000000403695  Unknown               Unknown  Unknown

Now, what is funny is that if I simply do:

# build
ifx main.f90 _build/subprojects/libcint/libcint.so '-Wl,-rpath,_build/subprojects/libcint'
# execute
./a.out

Then the result a.out runs smoothly (a bunch of numbers with a lot of zeros, if any). So there is something in the build process that prevents from the library and my program to interact correctly.

Again, note that this problem is specific to ifx, and that the whole thing works correctly with gfortran, so I guess there is an option there that ifx does not likes or interpret differently :)

Let me know if you need something else.

Expected behavior

The full build results in a working executable.

system parameters

dcbaker commented 6 months ago

Could you include the relevant compile and link lines from the build.ninja?

pierre-24 commented 6 months ago

There you go:

build.ninja ``` # This is the build file for project "test_libcint" # It is autogenerated by the Meson build system. # Do not edit by hand. ninja_required_version = 1.8.2 # Rules for module scanning. rule depscan command = /usr/bin/meson --internal depscan $picklefile $out $in description = Module scanner. # Rules for compiling. rule fortran_COMPILER command = ifx $ARGS -gen-dep=$out -gen-depformat=make -o $out -c $in deps = gcc depfile = $DEPFILE_UNQUOTED description = Compiling Fortran object $out restat = 1 rule c_COMPILER command = cc $ARGS -MD -MQ $out -MF $DEPFILE -o $out -c $in deps = gcc depfile = $DEPFILE_UNQUOTED description = Compiling C object $out # Rules for linking. rule fortran_LINKER command = ifx $ARGS -o $out $in $LINK_ARGS description = Linking target $out rule c_LINKER command = cc $ARGS -o $out $in $LINK_ARGS description = Linking target $out rule SHSYM command = /usr/bin/meson --internal symbolextractor /home/pierre/Downloads/tmp/_build $in $IMPLIB $out $CROSS description = Generating symbol file $out restat = 1 # Other rules rule CUSTOM_COMMAND command = $COMMAND description = $DESC restat = 1 rule REGENERATE_BUILD command = /usr/bin/meson --internal regenerate /home/pierre/Downloads/tmp . description = Regenerating build files. generator = 1 # Phony build target, always out of date build PHONY: phony # Build rules for targets build subprojects/libcint/libcint.so.p/src_c2f.c.o: c_COMPILER ../subprojects/libcint/src/c2f.c DEPFILE = subprojects/libcint/libcint.so.p/src_c2f.c.o.d DEPFILE_UNQUOTED = subprojects/libcint/libcint.so.p/src_c2f.c.o.d ARGS = -Isubprojects/libcint/libcint.so.p -Isubprojects/libcint -I../subprojects/libcint -Isubprojects/libcint/src -I../subprojects/libcint/src -Isubprojects/libcint/include -I../subprojects/libcint/include -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Wpedantic -O0 -g -fPIC -march=native -fno-math-errno -funroll-loops -ftree-vectorize -DHAVE_QUADMATH_H -DWITH_FORTRAN (...) build subprojects/libcint/libcint.so.p/libcint.so.symbols: SHSYM subprojects/libcint/libcint.so IMPLIB = subprojects/libcint/libcint.so build subprojects/libcint/libcint.so: c_LINKER subprojects/libcint/libcint.so.p/src_c2f.c.o subprojects/libcint/libcint.so.p/src_cart2sph.c.o subprojects/libcint/libcint.so.p/src_cint1e.c.o subprojects/libcint/libcint.so.p/src_cint2e.c.o subprojects/libcint/libcint.so.p/src_cint_bas.c.o subprojects/libcint/libcint.so.p/src_fblas.c.o subprojects/libcint/libcint.so.p/src_g1e.c.o subprojects/libcint/libcint.so.p/src_g2e.c.o subprojects/libcint/libcint.so.p/src_misc.c.o subprojects/libcint/libcint.so.p/src_optimizer.c.o subprojects/libcint/libcint.so.p/src_fmt.c.o subprojects/libcint/libcint.so.p/src_rys_wheeler.c.o subprojects/libcint/libcint.so.p/src_eigh.c.o subprojects/libcint/libcint.so.p/src_rys_roots.c.o subprojects/libcint/libcint.so.p/src_find_roots.c.o subprojects/libcint/libcint.so.p/src_cint2c2e.c.o subprojects/libcint/libcint.so.p/src_g2c2e.c.o subprojects/libcint/libcint.so.p/src_cint3c2e.c.o subprojects/libcint/libcint.so.p/src_g3c2e.c.o subprojects/libcint/libcint.so.p/src_cint3c1e.c.o subprojects/libcint/libcint.so.p/src_g3c1e.c.o subprojects/libcint/libcint.so.p/src_breit.c.o subprojects/libcint/libcint.so.p/src_cint1e_a.c.o subprojects/libcint/libcint.so.p/src_cint3c1e_a.c.o subprojects/libcint/libcint.so.p/src_cint1e_grids.c.o subprojects/libcint/libcint.so.p/src_g1e_grids.c.o subprojects/libcint/libcint.so.p/src_autocode_breit1.c.o subprojects/libcint/libcint.so.p/src_autocode_dkb.c.o subprojects/libcint/libcint.so.p/src_autocode_gaunt1.c.o subprojects/libcint/libcint.so.p/src_autocode_grad1.c.o subprojects/libcint/libcint.so.p/src_autocode_grad2.c.o subprojects/libcint/libcint.so.p/src_autocode_hess.c.o subprojects/libcint/libcint.so.p/src_autocode_int3c1e.c.o subprojects/libcint/libcint.so.p/src_autocode_int3c2e.c.o subprojects/libcint/libcint.so.p/src_autocode_intor1.c.o subprojects/libcint/libcint.so.p/src_autocode_intor2.c.o subprojects/libcint/libcint.so.p/src_autocode_intor3.c.o subprojects/libcint/libcint.so.p/src_autocode_intor4.c.o subprojects/libcint/libcint.so.p/src_autocode_deriv3.c.o subprojects/libcint/libcint.so.p/src_autocode_int1e_grids1.c.o subprojects/libcint/libcint.so.p/src_autocode_deriv4.c.o subprojects/libcint/libcint.so.p/src_autocode_lresc.c.o | /usr/lib/gcc/x86_64-redhat-linux/13/libquadmath.so /usr/lib64/libm.so LINK_ARGS = -Wl,--as-needed -Wl,--no-undefined -shared -fPIC -Wl,--start-group -Wl,-soname,libcint.so -lm -lquadmath -Wl,--end-group build test_libcint.p/main.f90.o: fortran_COMPILER ../main.f90 || subprojects/libcint/libcint.so test_libcint.p/depscan.dd DEPFILE = test_libcint.p/main.f90.o.d DEPFILE_UNQUOTED = test_libcint.p/main.f90.o.d ARGS = -Itest_libcint.p -I. -I.. -Isubprojects/libcint/src -I../subprojects/libcint/src -Isubprojects/libcint/include -I../subprojects/libcint/include -Isubprojects/libcint/libcint.so.p -D_FILE_OFFSET_BITS=64 -warn all -g -traceback -O0 -g '-DPROJECT_NAME="libtest_libcint"' '-DPROJECT_VERSION="0.1.0"' -module test_libcint.p dyndep = test_libcint.p/depscan.dd build test_libcint.p/depscan.dd: depscan /home/pierre/Downloads/tmp/_build/test_libcint.p/test_libcint-deps.json picklefile = test_libcint.p/test_libcint.dat build test_libcint: fortran_LINKER test_libcint.p/main.f90.o | subprojects/libcint/libcint.so.p/libcint.so.symbols LINK_ARGS = -Wl,--as-needed -Wl,--no-undefined '-Wl,-rpath,$$ORIGIN/subprojects/libcint' -Wl,-rpath-link,/home/pierre/Downloads/tmp/_build/subprojects/libcint -Wl,--start-group subprojects/libcint/libcint.so -lm -lquadmath -lifcore -limf -Wl,--end-group # Test rules build test: phony meson-internal__test build meson-internal__test: CUSTOM_COMMAND all PHONY COMMAND = /usr/bin/meson test --no-rebuild --print-errorlogs DESC = Running$ all$ tests. pool = console build benchmark: phony meson-internal__benchmark build meson-internal__benchmark: CUSTOM_COMMAND all PHONY COMMAND = /usr/bin/meson test --benchmark --logbase benchmarklog --num-processes=1 --no-rebuild DESC = Running$ benchmark$ suite. pool = console # Install rules build install: phony meson-internal__install build meson-internal__install: CUSTOM_COMMAND PHONY | all DESC = Installing$ files. COMMAND = /usr/bin/meson install --no-rebuild pool = console build dist: phony meson-internal__dist build meson-internal__dist: CUSTOM_COMMAND PHONY DESC = Creating$ source$ packages COMMAND = /usr/bin/meson dist pool = console # Suffix build ctags: phony meson-internal__ctags build meson-internal__ctags: CUSTOM_COMMAND PHONY COMMAND = /usr/bin/meson --internal tags ctags /home/pierre/Downloads/tmp pool = console build uninstall: phony meson-internal__uninstall build meson-internal__uninstall: CUSTOM_COMMAND PHONY COMMAND = /usr/bin/meson --internal uninstall pool = console build all: phony meson-test-prereq meson-benchmark-prereq subprojects/libcint/libcint.so test_libcint build meson-test-prereq: phony build meson-benchmark-prereq: phony build clean: phony meson-internal__clean build meson-internal__clean: CUSTOM_COMMAND PHONY COMMAND = /usr/bin/ninja -t clean description = Cleaning build build.ninja: REGENERATE_BUILD ../meson.build ../subprojects/libcint/meson.build ../subprojects/libcint/meson_options.txt ../subprojects/libcint/include/meson.build ../subprojects/libcint/include/cint.h.in ../subprojects/libcint/src/meson.build ../subprojects/libcint/src/config.h.in meson-private/coredata.dat pool = console build reconfigure: REGENERATE_BUILD PHONY pool = console build ../meson.build ../subprojects/libcint/meson.build ../subprojects/libcint/meson_options.txt ../subprojects/libcint/include/meson.build ../subprojects/libcint/include/cint.h.in ../subprojects/libcint/src/meson.build ../subprojects/libcint/src/config.h.in meson-private/coredata.dat: phony default all ```