You are not logged in.

#1 2024-11-30 14:11:11

jtbc
Member
Registered: 2024-11-30
Posts: 4

[solved] libgfortran.so not updated after gcc7-fortran installation

Dear community,

As context :
I need to use binary libraries of a software, that have been I believe compiled with gfortran-7.
    Specifically I need the shared library libgfortran.so.4. So I created an symbolic link of libgfortran.so.4 from libgfortran.so.5, but I still lacked the version GFORTRAN_7.


So I installed from the AUR, gcc7 gcc7-libs and gcc7-fortran. But the installer is broken, since gcc7 is not supported anymore, but I could modify a bit the PKGBUILD to make it compile.

Specifically I added :
1.  "-ffile-prefix-map=/home/$USER/.cache/yay/gcc7/src=/usr/src/debug/gcc7" to the banned options for CFLAGS, CXXFLAGS
2. I did also ban of this option ffileprefix for FFLAGS and FCFLAGS
2. "-Wno-error=cpp"  for CFLAGS, CXXFLAGS to avoid a # FORTIFY ... error

And gcc7 and gfortran7 were indeed created inside /usr/bin, and I can gfortran-7 --version them without an issue. But /usr/lib/libgfortran as not been updated since I installed gcc9.

I'm not sure if removing brutally like I did the ffile-prefix-map flag in YFLAGS, is the reason, and how to circumvent the issue.


Best,

Last edited by jtbc (2024-12-02 14:26:36)

Offline

#2 2024-11-30 15:07:14

Lone_Wolf
Administrator
From: Netherlands, Europe
Registered: 2005-10-04
Posts: 13,038

Re: [solved] libgfortran.so not updated after gcc7-fortran installation

So I created an symbolic link of libgfortran.so.4 from libgfortran.so.5

Remove the symlink as it will give problems.

The gcc7  pacakges were orphaned over 2 years ago and there are several comments with needed changes on the aur page for gcc7 .

Please post the PKGBUILDS you use.


Disliking systemd intensely, but not satisfied with alternatives so focusing on taming systemd.

clean chroot building not flexible enough ?
Try clean chroot manager by graysky

Offline

#3 2024-11-30 16:40:40

jtbc
Member
Registered: 2024-11-30
Posts: 4

Re: [solved] libgfortran.so not updated after gcc7-fortran installation

With the symlink removed, there is no improvment. If I strings libgfortran.so and grep for GFORTRAN, I get still :

GFORTRAN_8
GFORTRAN_F2C_8
GFORTRAN_C99_8
GFORTRAN_9
GFORTRAN_9.2
GFORTRAN_10
GFORTRAN_10.2
GFORTRAN_12
GFORTRAN_13
GFORTRAN_UNBUFFERED_PRECONNECTED
GFORTRAN_UNFORMATTED_BUFFER_SIZE
GFORTRAN_FORMATTED_BUFFER_SIZE
GFORTRAN_STDIN_UNIT
GFORTRAN_STDOUT_UNIT
GFORTRAN_STDERR_UNIT
GFORTRAN_UNBUFFERED_ALL
GFORTRAN_SHOW_LOCUS
GFORTRAN_OPTIONAL_PLUS
GFORTRAN_LIST_SEPARATOR
GFORTRAN_CONVERT_UNIT
GFORTRAN_ERROR_BACKTRACE
GFORTRAN_8
GFORTRAN_10
GFORTRAN_F2C_8
GFORTRAN_10.2
GFORTRAN_9
GFORTRAN_13
GFORTRAN_9.2
GFORTRAN_C99_8
GFORTRAN_12



The PKGBUILD located in .cache/yay/gcc7, with modification in build() function (around line 89).
I modify after it using yay -S gcc7 gcc7-libs gcc7-fortran and before not showing the diff when asked by installation utility.

# Maintainer: David (ReyJamonico) < david at rjamo dot dev >
# Contributor: Viktor Drobot (aka dviktor) linux776 [at] gmail [dot] com
# Contributor: Sven-Hendrik Haase <svenstaro@gmail.com>
# Contributor: Konstantin Gizdov <arch@kge.pw>
# Contributor: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
# Contributor: Allan McRae <allan@archlinux.org>

# toolchain build order: linux-api-headers->glibc->binutils->gcc->binutils->glibc
# NOTE: libtool requires rebuilt with each new gcc version

pkgbase=gcc7
pkgname=(gcc7 gcc7-libs gcc7-fortran)
pkgver=7.5.0
_pkgver=7
_majorver=${pkgver:0:1}
_islver=0.18
pkgrel=4
pkgdesc='The GNU Compiler Collection (7.x.x)'
arch=(x86_64)
license=(GPL LGPL FDL custom)
url='http://gcc.gnu.org'
makedepends=(binutils libmpc doxygen python subversion flex)
options=(!emptydirs !lto)
source=(https://gcc.gnu.org/pub/gcc/releases/gcc-${pkgver}/gcc-${pkgver}.tar.xz
        https://gcc.gnu.org/pub/gcc/infrastructure/isl-${_islver}.tar.bz2
        bz84080.patch
        libsanitizer.patch)
sha256sums=('b81946e7f01f90528a1f7352ab08cc602b9ccc05d4e44da4bd501c5a189ee661'
            '6b8b0fd7f81d0a957beb3679c81bbb34ccc7568d5682844d8924424a0dadcb1b'
            'bce05807443558db55f0d6b4dae37a678ea1bb3388b541c876fe3d110e3717e7'
            'ee25895428a9dbd3217de109a043c54cb9f51e6a04a260be088a619c0f677e68')

_svnrev=266882
_svnurl=svn://gcc.gnu.org/svn/gcc/branches/gcc-${_majorver}-branch
_libdir=usr/lib/gcc/$CHOST/${pkgver%%+*}

snapshot() {
  svn export -r${_svnrev} ${_svnurl} gcc-r${_svnrev}

  local datestamp basever _pkgver
  basever=$(< gcc-r${_svnrev}/gcc/BASE-VER)
  datestamp=$(< gcc-r${_svnrev}/gcc/DATESTAMP)
  _pkgver=${basever}-${datestamp}

  mv gcc-r${_svnrev} gcc-${_pkgver}
  tar cf - gcc-${_pkgver} | xz > gcc-${_pkgver}.tar.xz
  rm -rf gcc-${_pkgver}
  gpg -b gcc-${_pkgver}.tar.xz
  scp gcc-${_pkgver}.tar.xz{,.sig} sources.archlinux.org:/srv/ftp/other/gcc/

  echo
  echo "pkgver=${_pkgver/-/+}"
}

prepare() {
  [[ ! -d gcc ]] && ln -s gcc-${pkgver/+/-} gcc
  cd gcc

  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84080
  patch -p0 -i "$srcdir/bz84080.patch"

  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92154
  patch -Np0 -i "${srcdir}/libsanitizer.patch"

  # link isl for in-tree build
  ln -s ../isl-${_islver} isl

  # Do not run fixincludes
  sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in

  # Arch Linux installs x86_64 libraries /lib
  sed -i '/m64=/s/lib64/lib/' gcc/config/i386/t-linux64

  # hack! - some configure tests for header files using "$CPP $CPPFLAGS"
  sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" {libiberty,gcc}/configure

  mkdir -p "$srcdir/gcc-build"
}

build() {
  export LD_PRELOAD=/usr/lib/libstdc++.so

  cd gcc-build

  # using -pipe causes spurious test-suite failures
  # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48565
  # -Werror=format-security causes compilation errors with GCC>10
  # And protection flags leave libgcc unusable
  banned_compile_options=("-pipe" "-Werror=format-security" "-fstack-clash-protection" "-fcf-protection" "-ffile-prefix-map=/home/myuser/.cache/yay/gcc7/src=/usr/src/debug/gcc7")

  for option in "${banned_compile_options[@]}"
  do
    CFLAGS=${CFLAGS/$option/}
    CXXFLAGS=${CXXFLAGS/$option/}
  done

  CFLAGS="${CFLAGS} -Wno-error=cpp"
  CXXFLAGS="${CXXFLAGS} -Wno-error=cpp"

  banned_compile_options=("-ffile-prefix-map=/home/myuser/.cache/yay/gcc7/src=/usr/src/debug/gcc7")

  for option in "${banned_compile_options[@]}"
  do
    FFLAGS=${FFLAGS/$option/}
    FCFLAGS=${FCFLAGS/$option/}
  done


  "$srcdir/gcc/configure" --prefix=/usr \
      --libdir=/usr/lib \
      --libexecdir=/usr/lib \
      --mandir=/usr/share/man \
      --infodir=/usr/share/info \
      --with-bugurl=https://bugs.archlinux.org/ \
      --enable-languages=c,c++,fortran,lto \
      --disable-multilib \
      --enable-shared \
      --enable-threads=posix \
      --enable-libmpx \
      --with-system-zlib \
      --with-isl \
      --enable-__cxa_atexit \
      --disable-libunwind-exceptions \
      --enable-clocale=gnu \
      --disable-libstdcxx-pch \
      --disable-libssp \
      --enable-gnu-unique-object \
      --enable-linker-build-id \
      --enable-lto \
      --enable-plugin \
      --enable-install-libiberty \
      --with-linker-hash-style=gnu \
      --enable-gnu-indirect-function \
      --disable-werror \
      --enable-checking=release \
      --enable-default-pie \
      --enable-default-ssp \
      --program-suffix=-${_pkgver} \
      --enable-version-specific-runtime-libs

  make

  # make documentation
  make -C $CHOST/libstdc++-v3/doc doc-man-doxygen
}

package_gcc7-libs() {
  pkgdesc='Runtime libraries shipped by GCC (7.x.x)'
  depends=('glibc>=2.27')
  options+=(!strip)

  export LD_PRELOAD=/usr/lib/libstdc++.so

  cd gcc-build
  make -C $CHOST/libgcc DESTDIR="$pkgdir" install-shared
  rm -f "$pkgdir/$_libdir/libgcc_eh.a"
  mv "$pkgdir"/usr/lib/gcc/$CHOST/lib/libgcc_s.so* "$pkgdir"/$_libdir

  for lib in libatomic \
             libcilkrts \
             libgfortran \
             libgomp \
             libitm \
             libquadmath \
             libsanitizer/{a,l,ub,t}san \
             libstdc++-v3/src \
             libvtv; do
    make -C $CHOST/$lib DESTDIR="$pkgdir" install-toolexeclibLTLIBRARIES
  done

  make -C $CHOST/libmpx DESTDIR="$pkgdir" install
  rm -f "$pkgdir"/$_libdir/libmpx.spec

  # Install Runtime Library Exception
  install -Dm644 "$srcdir/gcc/COPYING.RUNTIME" \
    "$pkgdir/usr/share/licenses/gcc7-libs/RUNTIME.LIBRARY.EXCEPTION"
}

package_gcc7() {
  pkgdesc="The GNU Compiler Collection - C and C++ frontends (7.x.x)"
  depends=("gcc7-libs=$pkgver-$pkgrel" 'binutils>=2.28' libmpc)
  options+=(staticlibs)

  export LD_PRELOAD=/usr/lib/libstdc++.so

  cd gcc-build

  make -C gcc DESTDIR="$pkgdir" install-driver install-cpp install-gcc-ar \
    c++.install-common install-headers install-plugin install-lto-wrapper

  install -m755 -t "$pkgdir/${_libdir}/" gcc/{cc1,cc1plus,collect2,lto1}

  make -C $CHOST/libgcc DESTDIR="$pkgdir" install
  rm -rf "$pkgdir"/usr/lib/gcc/$CHOST/lib*

  make -C $CHOST/libstdc++-v3/src DESTDIR="$pkgdir" install
  make -C $CHOST/libstdc++-v3/include DESTDIR="$pkgdir" install
  make -C $CHOST/libstdc++-v3/libsupc++ DESTDIR="$pkgdir" install
  make -C $CHOST/libstdc++-v3/python DESTDIR="$pkgdir" install

  make DESTDIR="$pkgdir" install-libcc1
  mv "$pkgdir"/usr/lib/libcc1.so* "$pkgdir"/${_libdir}
  rm -f "$pkgdir"/${_libdir}/libstdc++.so*

  make DESTDIR="$pkgdir" install-fixincludes
  make -C gcc DESTDIR="$pkgdir" install-mkheaders
  make -C lto-plugin DESTDIR="$pkgdir" install

  make -C $CHOST/libcilkrts DESTDIR="$pkgdir" install-nodist_{toolexeclib,cilkinclude}HEADERS
  make -C $CHOST/libgomp DESTDIR="$pkgdir" install-nodist_{libsubinclude,toolexeclib}HEADERS
  make -C $CHOST/libitm DESTDIR="$pkgdir" install-nodist_toolexeclibHEADERS
  make -C $CHOST/libquadmath DESTDIR="$pkgdir" install-nodist_libsubincludeHEADERS
  make -C $CHOST/libsanitizer DESTDIR="$pkgdir" install-nodist_{saninclude,toolexeclib}HEADERS
  make -C $CHOST/libsanitizer/asan DESTDIR="$pkgdir" install-nodist_toolexeclibHEADERS
  make -C $CHOST/libmpx DESTDIR="$pkgdir" install-nodist_toolexeclibHEADERS

  make -C libcpp DESTDIR="$pkgdir" install

  # many packages expect this symlink
  ln -s gcc-7 "$pkgdir"/usr/bin/cc-7

  rm -f "$pkgdir"/$_libdir/lib{stdc++,gcc_s}.so

  # byte-compile python libraries
  python -m compileall "$pkgdir/usr/share/gcc-${pkgver%%+*}/"
  python -O -m compileall "$pkgdir/usr/share/gcc-${pkgver%%+*}/"

  # Install Runtime Library Exception
  install -d "$pkgdir/usr/share/licenses/$pkgname/"
  ln -s /usr/share/licenses/gcc7-libs/RUNTIME.LIBRARY.EXCEPTION \
    "$pkgdir/usr/share/licenses/$pkgname/"

  # Remove conflicting files
  rm -rf "$pkgdir"/usr/share/locale
}

package_gcc7-fortran() {
  pkgdesc="Fortran front-end for GCC (7.x.x)"
  depends=("gcc7=$pkgver-$pkgrel")
  options=('!emptydirs')

  export LD_PRELOAD=/usr/lib/libstdc++.so

  cd gcc-build
  make -C $CHOST/libgfortran DESTDIR=$pkgdir install-cafexeclibLTLIBRARIES \
    install-{toolexeclibDATA,nodist_fincludeHEADERS}
  make -C $CHOST/libgomp DESTDIR=$pkgdir install-nodist_fincludeHEADERS
  make -C gcc DESTDIR=$pkgdir fortran.install-common
  install -Dm755 gcc/f951 $pkgdir/${_libdir}/f951

  ln -s gfortran-7 ${pkgdir}/usr/bin/f95-${_pkgver}

  # Install Runtime Library Exception
  install -d ${pkgdir}/usr/share/licenses/$pkgname
  ln -s ../gcc-libs/RUNTIME.LIBRARY.EXCEPTION ${pkgdir}/usr/share/licenses/$pkgname/
}


But I realized there was a message, at installation time that I did not pay attention.

(1/1) reinstalling gcc7-fortran                                                                                   [####################################################################] 100%
ldconfig: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link

The full message :

==> Making package: gcc7 7.5.0-4 (Sat 30 Nov 2024 17:29:49 CET)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Retrieving sources...
  -> Found gcc-7.5.0.tar.xz
  -> Found isl-0.18.tar.bz2
  -> Found bz84080.patch
  -> Found libsanitizer.patch
==> Validating source files with sha256sums...
    gcc-7.5.0.tar.xz ... Passed
    isl-0.18.tar.bz2 ... Passed
    bz84080.patch ... Passed
    libsanitizer.patch ... Passed
==> Removing existing $srcdir/ directory...
==> Extracting sources...
  -> Extracting gcc-7.5.0.tar.xz with bsdtar
  -> Extracting isl-0.18.tar.bz2 with bsdtar
==> Starting prepare()...
patching file gcc/testsuite/g++.dg/cpp1y/auto-fn47.C
patching file gcc/cp/pt.c
Hunk #1 succeeded at 2225 (offset 22 lines).
patching file libsanitizer/ChangeLog
patching file libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
patching file libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h
==> Sources are ready.
 -> gcc7-7.5.0-4 already made -- skipping build
==> Making package: gcc7 7.5.0-4 (Sat 30 Nov 2024 17:29:58 CET)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> WARNING: Using existing $srcdir/ tree
==> Sources are ready.
loading packages...
warning: gcc7-fortran-7.5.0-4 is up to date -- reinstalling
resolving dependencies...
looking for conflicting packages...

Package (1)   Old Version  New Version  Net Change

gcc7-fortran  7.5.0-4      7.5.0-4        0.00 MiB

Total Installed Size:  24.77 MiB
Net Upgrade Size:       0.00 MiB

:: Proceed with installation? [Y/n]
(1/1) checking keys in keyring                                                                                    [####################################################################] 100%
(1/1) checking package integrity                                                                                  [####################################################################] 100%
(1/1) loading package files                                                                                       [####################################################################] 100%
(1/1) checking for file conflicts                                                                                 [####################################################################] 100%
(1/1) checking available disk space                                                                               [####################################################################] 100%
:: Running pre-transaction hooks...
(1/1) Performing snapper pre snapshots for the following configurations...
==> root: 4213
:: Processing package changes...
(1/1) reinstalling gcc7-fortran                                                                                   [####################################################################] 100%
ldconfig: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link

ldconfig: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link

ldconfig: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link

ldconfig: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link

ldconfig: /usr/local/lib/libtbbbind.so.3 is not a symbolic link

ldconfig: /usr/local/lib/libtbb.so.12 is not a symbolic link

ldconfig: /usr/local/lib/libtcm_debug.so.1 is not a symbolic link

ldconfig: /usr/local/lib/libtcm.so.1 is not a symbolic link

ldconfig: /usr/local/lib/libhwloc.so.15 is not a symbolic link

:: Running post-transaction hooks...

Thanks for your insights !

Last edited by jtbc (2024-11-30 16:57:06)

Offline

#4 2024-11-30 17:18:05

loqs
Member
Registered: 2014-03-06
Posts: 18,136

Re: [solved] libgfortran.so not updated after gcc7-fortran installation

What is the library that has been compiled against libgfortran.so.4?

Offline

#5 2024-11-30 17:23:10

jtbc
Member
Registered: 2024-11-30
Posts: 4

Re: [solved] libgfortran.so not updated after gcc7-fortran installation

It is a scientific/proprietary software, for which I cannot have access to source code to recompile it, and have only the compiled libraries for use on linux os.

I can use the tool without any issue, but they provide an C++ API interface, which is quite usefull. I can write a c++ and compile via g++. It does compile, but if I wish to run my own binary I get :

./a.out: error while loading shared libraries: libgfortran.so.4: cannot open shared object file: No such file or directory

After generating a symlink from libfortran.so.5.0.0, I get :

./a.out: /usr/lib/libgfortran.so.4: version `GFORTRAN_7' not found (required by /path/to/software/api/lib/linux/libapi.so.5.1.0)

Last edited by jtbc (2024-11-30 17:35:35)

Offline

#6 2024-11-30 18:19:11

loqs
Member
Registered: 2014-03-06
Posts: 18,136

Re: [solved] libgfortran.so not updated after gcc7-fortran installation

gcc7-libs /usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0/libgfortran.so
gcc7-libs /usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0/libgfortran.so.4
gcc7-libs /usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0/libgfortran.so.4.0.0

Have you tried `-L /usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0/` to linker flags or `LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0/ a.out` to tell ld.so where to look for libgfortran.so.4?

Offline

#7 2024-11-30 19:05:44

jtbc
Member
Registered: 2024-11-30
Posts: 4

Re: [solved] libgfortran.so not updated after gcc7-fortran installation

Thanks big_smile Indeed, the gfortran libraries are indeed located at the /usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0, I should have checked more thoroughly.

After appending this path to LD_LIBRARY_PATH, it did detect properly GFORTRAN_VERSION 7.
I had an issue with the other GLIBC libraries and so on but by adding also `/usr/lib` to LD_LIBRARY_PATH, I had no more issue.

I just need to make sure to have `/usr/lib` in front of `/usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0`, in order for g++ to find all components, but that's it smile 


Is there still a way to append the gcc7-fortran to the /usr/lib/libgfortran.so ?
Or it is because, we shifted from .so.4 to .so.5 so that makepkg does not the link there, but keep it only inside gcc/x86_../7.5 ?

Offline

#8 2024-11-30 20:37:13

loqs
Member
Registered: 2014-03-06
Posts: 18,136

Re: [solved] libgfortran.so not updated after gcc7-fortran installation

jtbc wrote:

Is there still a way to append the gcc7-fortran to the /usr/lib/libgfortran.so ?
Or it is because, we shifted from .so.4 to .so.5 so that makepkg does not the link there, but keep it only inside gcc/x86_../7.5 ?

/usr/lib/libgfortran.so points to the library for the current version. The .so is only used at build time the linker follows the symlink and the resulting binary links to the correct version. You can try adding to the linker flags for the build

-Wl,-rpath=/usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0

To have the resulting binary search /usr/lib/gcc/x86_64-pc-linux-gnu/7.5.0 after /usr/lib.

Offline

Board footer

Powered by FluxBB