On Thu, 21 Feb 2019 16:13:15 -0800 Steve Kargl <s...@troutmask.apl.washington.edu> wrote: > On Thu, Feb 21, 2019 at 11:18:50PM +0100, Tijl Coosemans wrote: >> On Thu, 21 Feb 2019 13:30:41 -0500 Diane Bruce <d...@db.net> wrote: >>> On Thu, Feb 21, 2019 at 06:05:15PM +0100, Tijl Coosemans wrote: >>>> On Sun, 17 Feb 2019 10:16:04 -0500 Diane Bruce <d...@db.net> wrote: >>>>> Except python doesn't have an rpath which is why this keeps coming >>>>> up over and over again. >>>> >>>> Maybe we should just add the gcc rpaths to the python ports LDFLAGS >>>> without depending on gcc. Then python should use gcc libgcc_s when >>>> it exists and fall back to base system libgcc_s when it doesn't. >>> >>> Right. Or just provide a shell shim to LD_PRELOAD IFF it is noticed >>> a specific port will require a fortran built binary module later. >>> >>>> Maybe we should compile *all* ports with gcc rpaths without depending >>>> on gcc, just like we already compile everything with -fstack-protector >>>> in LDFLAGS. >>>> >>>> There's also the fact that gfortran behaves differently from the C >>>> compilers (both clang and gcc) when it comes to libgcc_s. Gfortran >>>> always links with libgcc_s. The C compilers link with libgcc.a first >>>> and then with libgcc_s only as needed. This eliminates almost all >>> >>> What is really happening is gfortran links with libgfortran (surprise >>> surprise) and libgfortran has the requirement for @GCC_4.6.0 or later >>> >>>> links with libgcc_s. The only ones left are for exception handling >>>> and stack unwinding and gcc libgcc_s and base system libgcc_s are >>>> version compatible for that so it doesn't matter which one gets picked >>>> up. The attached patch for lang/gcc8 makes gfortran behave just like >>>> the C compilers. >>> >>> Something like this was tried already. I'll have to dig into >>> my old notes. >> >> With my patch libgfortran only needs GCC_4.2.0 and works with base >> libgcc_s. > > Why not bump the major version number of the port?
Because that renames the library and like I said, renaming allows a process to load both versions, as your example shows. > % ~/work/x/bin/gfortran -o z hello.f90 > % ldd z > z: > libgfortran.so.5 => /usr/local/lib/gcc8/libgfortran.so.5 (0x200800000) > libm.so.5 => /lib/libm.so.5 (0x200645000) > libgcc_s.so.2 => /safe/sgk/work/x/lib/libgcc_s.so.2 (0x200c58000) > libquadmath.so.0 => /usr/local/lib/gcc8/libquadmath.so.0 (0x200e70000) > libc.so.7 => /lib/libc.so.7 (0x2010b0000) > libz.so.6 => /lib/libz.so.6 (0x200678000) > libgcc_s.so.1 => /usr/local/lib/gcc8/libgcc_s.so.1 (0x2014a1000) > % nm z | grep 4.6 > U __multf3@@GCC_4.6.0 > % ./z > 2.00000000000000000000000000000000000 > > Note, I'm playing with a test install into a ~/work/x directory. > The ldconfig still has issues with first come first served > > % ldconfig -r | grep libgcc_s > 6:-lgcc_s.1 => /lib/libgcc_s.so.1 > 806:-lgcc_s.1 => /usr/local/lib/gcc8/libgcc_s.so.1 > 880:-lgcc_s.2 => /safe/sgk/work/x/lib/libgcc_s.so.2 > % ldconfig -r | grep libgfortran > 808:-lgfortran.5 => /usr/local/lib/gcc8/libgfortran.so.5 > 876:-lgfortran.5 => /safe/sgk/work/x/lib/libgfortran.so.5 > > 6 is picked up due to libc.so. 806 is picked up due to > 808, but won't be there is major version number is > bumped. 876 is the loser of the first come first served, here; > but 808 would be the correct libgfortran point to 880 if I > had installed into /usr/local/lib/gcc8. The ldconfig order can be improved. I've attached another patch that I've been using for a long time. It changes /etc/rc.d/ldconfig so it puts /usr/lib and /lib last, just like compilers and linkers do at compile time, and as documented in rtld(1). It also sorts paths like /usr/local/lib/gcc(7|8|9|10) in reverse version order so if multiple versions are installed the most recent libgcc_s is listed first. > PS: For the record, the GCC_4.6.0 are needed for gfortran REAL(16) > type. With my patch gfortran resolves the GCC_4.6.0 symbols statically just like the C compilers do. If the C compilers didn't do this we'd have this libgcc_s problem all over the place. It makes perfect sense to make gfortran do the same thing.
Index: libexec/rc/rc.conf =================================================================== --- libexec/rc/rc.conf (revision 343935) +++ libexec/rc/rc.conf (working copy) @@ -636,14 +636,14 @@ linux_enable="NO" # Linux binary compatibility loaded clear_tmp_enable="NO" # Clear /tmp at startup. clear_tmp_X="YES" # Clear and recreate X11-related directories in /tmp ldconfig_insecure="NO" # Set to YES to disable ldconfig security checks -ldconfig_paths="/usr/lib/compat /usr/local/lib /usr/local/lib/compat/pkg" +ldconfig_paths="/usr/local/lib /usr/local/lib/compat/pkg /usr/lib /usr/lib/compat /lib" # shared library search paths ldconfig32_paths="/usr/lib32 /usr/lib32/compat" # 32-bit compatibility shared library search paths -ldconfigsoft_paths="/usr/libsoft /usr/libsoft/compat /usr/local/libsoft" +ldconfigsoft_paths="/usr/local/libsoft /usr/libsoft /usr/libsoft/compat" # soft float compatibility shared library search paths # Note: temporarily with extra stuff for transition -ldconfig_paths_aout="/usr/lib/compat/aout /usr/local/lib/aout" +ldconfig_paths_aout="/usr/local/lib/aout /usr/lib/aout /usr/lib/compat/aout" # a.out shared library search paths ldconfig_local_dirs="/usr/local/libdata/ldconfig" # Local directories with ldconfig configuration files. Index: libexec/rc/rc.d/ldconfig =================================================================== --- libexec/rc/rc.d/ldconfig (revision 343935) +++ libexec/rc/rc.d/ldconfig (working copy) @@ -17,22 +17,23 @@ stop_cmd=":" ldconfig_start() { - local _files _ins + local _files _ins _paths _LDC _ins= ldconfig=${ldconfig_command} checkyesno ldconfig_insecure && _ins="-i" if [ -x "${ldconfig_command}" ]; then - _LDC="/lib /usr/lib" + _paths="" for i in ${ldconfig_local_dirs}; do if [ -d "${i}" ]; then _files=`find ${i} -type f` if [ -n "${_files}" ]; then - ldconfig_paths="${ldconfig_paths} `cat ${_files} | sort -u`" + _paths="${_paths} `cat ${_files} | sort -Vru`" fi fi done - for i in ${ldconfig_paths} /etc/ld-elf.so.conf; do + _LDC="" + for i in ${_paths} ${ldconfig_paths} /etc/ld-elf.so.conf; do if [ -r "${i}" ]; then _LDC="${_LDC} ${i}" fi @@ -42,16 +43,17 @@ ldconfig_start() case `sysctl -n hw.machine_arch` in amd64|mips64|powerpc64) + _paths="" for i in ${ldconfig_local32_dirs}; do if [ -d "${i}" ]; then _files=`find ${i} -type f` if [ -n "${_files}" ]; then - ldconfig32_paths="${ldconfig32_paths} `cat ${_files} | sort -u`" + _paths="${_paths} `cat ${_files} | sort -Vru`" fi fi done _LDC="" - for i in ${ldconfig32_paths}; do + for i in ${_paths} ${ldconfig32_paths}; do if [ -r "${i}" ]; then _LDC="${_LDC} ${i}" fi @@ -64,16 +66,17 @@ ldconfig_start() case `sysctl -n hw.machine_arch` in armv[67]) + _paths="" for i in ${ldconfig_localsoft_dirs}; do if [ -d "${i}" ]; then _files=`find ${i} -type f` if [ -n "${_files}" ]; then - ldconfigsoft_paths="${ldconfigsoft_paths} `cat ${_files} | sort -u`" + _paths="${_paths} `cat ${_files} | sort -Vru`" fi fi done _LDC="" - for i in ${ldconfigsoft_paths}; do + for i in ${_paths} ${ldconfigsoft_paths}; do if [ -r "${i}" ]; then _LDC="${_LDC} ${i}" fi @@ -87,10 +90,8 @@ ldconfig_start() # Legacy aout support for i386 only case `sysctl -n hw.machine_arch` in i386) - # Default the a.out ldconfig path. - : ${ldconfig_paths_aout=${ldconfig_paths}} _LDC="" - for i in /usr/lib/aout ${ldconfig_paths_aout} /etc/ld.so.conf; do + for i in ${ldconfig_paths_aout} /etc/ld.so.conf; do if [ -r "${i}" ]; then _LDC="${_LDC} ${i}" fi
_______________________________________________ freebsd-ports@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-ports To unsubscribe, send any mail to "freebsd-ports-unsubscr...@freebsd.org"