mesonbuild / meson

The Meson Build System

Home Page:http://mesonbuild.com

Repository from Github https://github.commesonbuild/mesonRepository from Github https://github.commesonbuild/meson

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.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

  • 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