On Thu, 21 Feb 2019 16:13:15 -0800 Steve Kargl
<[email protected]> 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 <[email protected]> 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 <[email protected]> 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
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ports
To unsubscribe, send any mail to "[email protected]"