You are not logged in.
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
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
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
What is the library that has been compiled against libgfortran.so.4?
Offline
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
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
Thanks 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
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
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