On Tue, Jan 23, 2024 at 01:37:54PM +0200, Janne Blomqvist wrote:
> 
> > - If I get this right, to take one example, the Fortran front-end will emit 
> > a call to gfortran_acospi_r4(), libgfortran provides this as a wrapper 
> > calling acospif(), which is called either from libm or from libgfortran. 
> > This is different from other math library functions, like ACOS() where the 
> > acosf() call is generated directly from the front-end (and then the 
> > implementation comes either from libm or from libgfortran). Why not follow 
> > our usual way of doing things?
> 
> Good point, that's what we've done in c99_functions.c in libgfortran.
> We should probably do this so we can skip jumping via libgfortran when
> libm implements these directly.
> 

Hopefully, FX sees this as my emails to gmail bounce.

I don't see how this can work or I don't understand symbol versioning
in libraries.

If an OS does not supply cospi() in its libm, then gfortran will
fallback to a cospi() in libgfortran.  With the indirection I 
currently implement, cospi() is not in the symbol map of libgfortran
and _gfortran_cospi_r4() will use the libgfortran version.  Now, if
the OS adds cospi() to libm and it's in libm's symbol map, then the
cospi() used by gfortran depends on the search order of the loaded
libraries.  Consider on FreeBSD, I have

% nm --dynamic /lib/libm.so.5 | grep cospi
0000000000025b60 T cospi@@FBSD_1.7
0000000000025fe0 T cospif@@FBSD_1.7
000000000002e230 T cospil@@FBSD_1.7

% nm --dynamic work/lib/libgfortran.so.5 | grep cospi
00000000002b1e60 T _gfortran_acospi_r10@@GFORTRAN_14
00000000002b4590 T _gfortran_acospi_r16@@GFORTRAN_14
00000000002b1d80 T _gfortran_acospi_r4@@GFORTRAN_14
00000000002b1df0 T _gfortran_acospi_r8@@GFORTRAN_14
00000000002b1ea0 T _gfortran_cospi_r10@@GFORTRAN_14
00000000002b46d0 T _gfortran_cospi_r16@@GFORTRAN_14
00000000002b1dc0 T _gfortran_cospi_r4@@GFORTRAN_14
00000000002b1e30 T _gfortran_cospi_r8@@GFORTRAN_14
                 U cospi@FBSD_1.7
                 U cospif@FBSD_1.7
                 U cospil@FBSD_1.7

The FE generates code for _gfortran_cospi_rXX.  If FreeBSD
adds say acospif() and libgfortran also exported, then 
how does the linker choose between acospif@@FBSD_1.7 and
acospif@@GFORTRAN_14?.

-- 
Steve

Reply via email to