FreeCAD 0.17 && /lib//libgcc_s.so.1
Tijl Coosemans
tijl at FreeBSD.org
Fri Feb 22 11:29:59 UTC 2019
On Thu, 21 Feb 2019 16:13:15 -0800 Steve Kargl
<sgk at 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 <db at 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 <db at 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ldconfig.patch
Type: text/x-patch
Size: 3761 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-ports/attachments/20190222/6ce0f9c9/attachment.bin>
More information about the freebsd-ports
mailing list