Meson does not correctly handle `ifx` when linking to an external library
pierre-24 opened this issue · comments
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.wrapNow, 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_libcintFor 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.outThen 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
- Native build
- Fedora 39
- Python 3.12.2
- Meson 1.4.0
- Ninja 1.11.1
Could you include the relevant compile and link lines from the build.ninja?
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