Ilya Zakharevich on Sat, 3 Oct 1998 18:28:08 -0400 (EDT)


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: -KPIC


Background:  I'm supporting a Perl interface to a huge math library
PARI.  PARI includes assembler files to speed up the core
multiple-precision arithmetic.  However, these files are not compiled
with PIC.

Below is my exchange with the maintainers of PARI wrt the need of
PIC.  Can somebody knowledgable resolve this?  My understanding of the
situation may be obsolete by a couple of years, when the recipe was
the following:

    a) On most arch "true" dynamic linking requires PIC;
    b) On few archs (like Solaris) PIC-less object files are
       tolerated, but having them defeats the purpose of dynalinking.
       The picture is as follows:

       A) Disk space sharing with different executables;
       B) Memory sharing with different executables;
       C) Memory sharing with the same executables;
       D) As speedy as static;

		 A	 B	 C	D

  Static	 -	 -	 X	X
  Dyna & PIC	 X	 X	 X	-
  Dyna ! PIC	 X	 -	 -	X

       Note absense of 'C' without PIC.

Did it change lately?

Ilya

Karim BELABAS writes:
> 
> 
> [Ilya:]
> > Do I understand it correct that PARI cannot be put into a shared
> > library nowadays?  I tried to compile sparc assembler with -K PIC, and
> > got a segfault.  
> > 
> > AFAIK Solaris allows DLLs without -K PIC, but they are not shared.  Do
> > not know about SunOS4.  Most anyone else requires PIC for shared
> > libraries - except platforms which have "hard linking" DLLs without
> > any relocation, like OS/2, AIX, DG-UX (?).
> > 
> > Is there any architecture ((except port ;-) which requires PIC, and
> > PARI supports it?  Currently the prospect of having PARI as
> > DynaLoadable Perl extension looks kinda moot...
> 
> Very weird; could you be more specific? On most architectures mentionned in
> the MACHINES file (including solaris-[super|micro|ultra]sparc), a
> DLL libpari.so could be built, gp-dyn linked with it and gave sensible
> running times. In my experience, (with gcc mostly) -fPIC flag is not needed
> and, when used, give disastrous results (_slow_ binaries).
> 
> HPUX was a (hard) special case and the only one I could test where gcc
> -fPIC / cc +z was actually needed (and giving an executable about least
> twice slower).
> 
> Karim.
> 
> P.S: Here's my current (2.0.12 not released yet) MACHINES file
>                                                   Bench (in ms)
> Arch / proc:         OS:             Configure:     sta:    dyn:  GP version:
> ==============================================================================
> DEC/Alpha
> alpha21164   600MHz  OSF1-V4.0D      cc  X11 dl2    3996    4384   2.0.10   LG
> alpha21164   533Mhz  Linux 2.0.34    gcc X11 dl2    5105    5031   2.0.10   JC
> alpha21164   500Mhz  Linux-2.0.30    gcc X11 dl2    4806    4791   2.0.12
> alpha21064   172Mhz  OSF1-3.0        cc  X11 dl2   30208   29754   2.0.12
> ------------------------------------------------------------------------------
> Sun/SPARC
> UltraSPARC10 300MHz  Solaris-2.6     gcc X11 dl2    5932    6102   2.0.12   GN
> UltraSPARC   300MHz  Solaris-2.5     gcc X11 dl2    7643    7566   2.0.9    IS
> UltraSPARC2i 270MHz  Solaris-2.6     gcc X11 dl2    7068    7218   2.0.10   LG
> UltraSPARC2i 270MHz  Solaris-2.6     cc  X11 dl2    9200    9970   2.0.10   LG
> UltraSPARC   167MHz  Solaris-2.6     gcc X11 dl2    9790   10158   2.0.12   GN
> UltraSPARC   167MHz  Solaris-2.5     gcc X11 dl2   10257   10125   2.0.12
> UltraSPARC   167MHz  Solaris-2.5     g++ X11 dl2   13474   13418   2.0.9 (7)LG
> UltraSPARC   167MHz  Solaris-2.5     CC  X11 -     15778   16400   2.0.9    LG
> UltraSPARC   167MHz  Solaris-2.5     cc  X11 dl2   16241   17048   2.0.9    LG
> UltraSPARC   143MHz  Solaris-2.5     gcc X11 dl2   11335   11613   2.0.12
> SuperSPARC2   75MHz  Solaris-2.5     gcc X11 dl2   16969   17013   2.0.10   LG
> SuperSPARC    40MHz  SunOS-4.1.3     gcc X11 dl2   28254   28394   2.0.12
> SuperSPARC    40Mhz  Solaris-2.5     gcc X11 dl2   27828   28353   2.0.12
> TurboSPARC   170MHz  Solaris-2.5     gcc X11 dl2   15907   16529   2.0.9    LG
> MicroSPARC2  110MHz  NextStep-v3     cc    -   -   37794       -   2.0.9    LG
> MicroSPARC2  110MHz  SunOS-4.1.4     gcc X11 dl2   31476   32123   2.0.9    LG
> MicroSPARC2  110MHz  Solaris-2.5     gcc X11 dl2   22664   23406   2.0.12
> SPARCv7(SS2)  40MHz  SunOS-4.1.3     gcc X11 dl   115212  115364   2.0.9    LG
> SPARCv7(ELC)  33MHz  SunOS-4.1.1     gcc X11   -  139406       -   2.0.8    GN
> ------------------------------------------------------------------------------
> Intel/x86
> PentiumII    333Mhz  Linux-2.0.32    gcc X11 dl2    5006    4762   2.0.10   JC
> PentiumII    300MHz  NextStep-3.3    cc    -   -    5325       -   2.0.10
> Pentium      266Mhz  Linux-2.0.29    gcc X11 dl2    7256    7044   2.0.11
> PentiumII    233MHz  FreeBSD-2.2.5   gcc X11 dl2    6251    6114   2.0.11
> PentiumPro   200MHz  Linux-2.0.27    gcc X11 dl2   12088   12214   2.0.4k
> Pentium      200Mhz  NextStep-3.3    cc    -   -   16035       -   2.0.6    MS
> Pentium      166MHz  FreeBSD-2.2.5   gcc X11 dl2   15159   14481   2.0.11
> Pentium      166MHz  Solaris-2.6     gcc X11 dl2   13550   13746   2.0.12   GN
> Pentium      133MHz  Linux-1.2.8     gcc X11   -   15448       -   2.0.12(5)GN
> Pentium      133MHz  FreeBSD-2.2.5   gcc X11 dl2   15231   17259   2.0.10   KK
> 486dx2        50MHz  Linux-2.0.33    gcc X11 dl2  213710  216224   2.0.9    LG
> 486dx         50MHz  DOS-5.0         gcc   -   -   77639       -   2.0.12
> *i860         40MHz  Concentrix      cc  X11   -  147989       -   2.0.9    LG
> ------------------------------------------------------------------------------
> Motorola
> *MC68040      25MHz  NextStep-v2     cc    -   -  250542       -   2.0.9    LG
> MC68030       25MHz  SunOS-4.0.3     gcc X11   -  683736  685248   2.0.9 (4)
> *MC68030      25MHz  SunOS-4.0.3     gcc X11   - 1034136 1038368   2.0.9
> ------------------------------------------------------------------------------
> IBM/POWER,PowerPC
> *PPC604e     233MHz  AIX-4.2         cc  X11   -    8616       -   2.0.12(3)GN
> *PPC604      133MHz  AIX-4.2         cc  X11   -   21528       -   2.0.4 (3)GN
> *PPC601      100MHz  AIX-4.1         cc  X11   -   21692       -   2.0.4 (3)GN
> *PPC601       75MHz  Linux-2.1.24    gcc   - dl2   51810   52702   2.0.9    EK
> *PPC601       66MHz  AIX-3.2.5       cc  X11   -   66280       -   2.0.4 (3)GN
> *POWER2       66MHz  AIX-4.2         cc  X11   -   37592       -   2.0.4 (3)GN
> ------------------------------------------------------------------------------
> SGI/MIPS
> *R4000     50/70MHz  IRIX-5.2        gcc X11 dl2   70764   70114   2.0.9 (1)TP
> *R4000     50/70MHz  IRIX-5.2        cc  X11 dl2   81467   80176   2.0.9 (2)TP
> *R10000      196MHz  IRIX-6.4        cc  X11 dl2    8461    9856   2.0.10(8)TP
> ------------------------------------------------------------------------------
> HP/PA-RISC
> HPPA9000/778  134MHz HPUX-10.20      cc  X11   -   16276   29212   2.0.12(9)
> *HPPA9000/778 134MHz HPUX-10.20      cc  X11   -   23666           2.0.12(10)
> HPPA9000/735  100MHz HPUX-10.20      cc  X11   -   25106   38898   2.0.12(9)
> HPPA9000/720     ??? HPUX-10.20      cc  X11   -   66138       -   2.0.9
> *HPPA9000/720    ??? HPUX-10.20      cc  X11   -  101114  119626   2.0.9
> HPPA9000/712   90MHz HPUX-10.20      cc  X11   -   26756   45196   2.0.12(9)
> *HPPA9000/712    ??? HPUX-10.10      gcc X11   -   66328   71250   2.0.5 (6)
> *HPPA7100LC    60MHz NextStep-v3     cc    -   -   62866       -   2.0.10   LG
> *HPPA7000      50MHz HPUX-09.05      cc  X11   -  113406  152778   2.0.9    LG
> ------------------------------------------------------------------------------
> 
> Notes:
> ======
> (1) uncomment the last PLOTLIBS= in Makefile
> (2) same as above, compiled with cc -O2
> (3) AIX/POWER versions built with cc options including
>       -qarch=com -qtune=601 (any other tuning makes them slower)
> (4) Slightly different results in make bench (last decimal different in
>     3 tests, due to a different mulsr())
> (5) built with gcc 2.7.2p
> (6) gcc -fPIC (otherwise /usr/bin/ld will not link the shared library)
> (7) the `program' bench fails on "install(addii)". But if the symbol addii
>     is declared within extern "C" {} in paridecl.h, it works.
> 
> (8) use
> CC         = cc -64
> CFLAGS     = -O -OPT:Olimit=2170
> LD         = cc -64
> LDFLAGS    = -O -L/usr/lib64
> DLLD       = cc -64
> DLLDFLAGS  = -shared -elf -no_unresolved -all -L/usr/lib64
> CPP        = cc -64 -E -I.
> 
> (9) * for gp-dyn: in o-hpux.hppa/Makefile, move kernel.o from OBJS to OBJSGP. I
> couldn't find a way to have HP as (needed since gas doesn't understand our
> syntax) to produce PIC code, hence kernel.o has to be linked explicitly with
> all programs compiled with libpari.sl
> 
>     * for gp-sta: remove +z from CFLAGS, final link only worked with the
> following command line (there has to be a better way...):
> 
> cc dummy.c -c
> cc -o gp-sta -Wl,-a,archive -O dummy.o [... rest as produced by Configure]
> 
> where dummy.c defines two dummy symbols (referenced in static libc):
> 
> shl_findsym(){}
>    shl_load(){}
> 
> Whatever else I tried, linking failed:
> 
> /usr/ccs/bin/ld: Data address is out of range for short load or store
>    Reference from:  kernel.o(0x8) [for all symbols defined in level0.s]
> 
> (10) compiled without +z flags
> --
> Karim Belabas                    email: Karim.Belabas@math.u-psud.fr
> Dep. de Mathematiques, Bat. 425
> Universite Paris-Sud             Tel: (00 33) 1 69 15 57 48
> F-91405 Orsay (France)           Fax: (00 33) 1 69 15 60 19
> --
> PARI/GP Home Page: http://pari.home.ml.org
>