Thread: Compiling PL/Perl and Pl/Python on x86_64

Compiling PL/Perl and Pl/Python on x86_64

From
imacat
Date:
Dear all,
   I cannot compile PL/Perl and PL/Python under x86_64.  I'm running
Intel Pentium D 3.2GHz Dual-core, Debian GNU/Linux AMD64 port, kernel
2.6.16.14, gcc 3.4.4, glibc 2.3.2, perl 5.8.8, Python 2.4.3.

imacat@yuki ~ % uname -a
Linux yuki 2.6.16.14-allmods #1 SMP Sat May 6 18:25:11 CST 2006 x86_64 GNU/Linux
   To complie PL/Perl:

imacat@yuki /tmp/postgresql-8.1.3 % ./configure --prefix=/usr
--sysconfdir=/etc  --localstatedir=/var --mandir=/usr/share/man
--enable-nls --with-docdir=/usr/sha re/doc/postgresql --with-perl
--with-pam
checking build system type... x86_64-unknown-linux-gnu
...
config.status: linking ./src/makefiles/Makefile.linux to
src/Makefile.port
imacat@yuki /tmp/postgresql-8.1.3 % make
make -C doc all
...
tsort: -: input contains a loop:
tsort: SPI.o
tsort: plperl.o
ranlib libplperl.a
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after- statement -Wendif-labels -fno-strict-aliasing -fpic
-shared -Wl,-soname,libplper l.so.0  plperl.o spi_internal.o SPI.o
-L/usr/local/lib -L/usr/lib/perl5/5.8.8/x8
6_64-linux-thread-multi-ld/CORE -L../../../src/port
/usr/lib/perl5/5.8.8/x86_64-
linux-thread-multi-ld/auto/DynaLoader/DynaLoader.a -lperl -lnsl -ldl -lm
-lcrypt  -lutil -lpthread -lc
-Wl,-rpath,/usr/lib/perl5/5.8.8/x86_64-linux-thread-multi- ld/CORE -o
libplperl.so.0.0
/usr/bin/ld:
/usr/lib/perl5/5.8.8/x86_64-linux-thread-multi-ld/auto/DynaLoader/D
ynaLoader.a(DynaLoader.o): relocation R_X86_64_32 can not be used when
making a  shared object; recompile with -fPIC
/usr/lib/perl5/5.8.8/x86_64-linux-thread-multi-ld/auto/DynaLoader/DynaLoader.a:
could not read symbols: Bad value
collect2: ld returned 1 exit status
make[3]: *** [libplperl.so.0.0] Error 1
make[3]: Leaving directory `/tmp/postgresql-8.1.3/src/pl/plperl'
make[2]: *** [all] Error 1
make[2]: Leaving directory `/tmp/postgresql-8.1.3/src/pl'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/tmp/postgresql-8.1.3/src'
make: *** [all] Error 2
imacat@yuki /tmp/postgresql-8.1.3 %
   The same goes for PL/Python:

imacat@yuki /tmp/postgresql-8.1.3 % ./configure --prefix=/usr
--sysconfdir=/etc --localstatedir=/var --mandir=/usr/share/man
--enable-nls --with-docdir=/usr/share/doc/postgresql --with-python
--with-pam
checking build system type... x86_64-unknown-linux-gnu
...
config.status: linking ./src/makefiles/Makefile.linux to
src/Makefile.port
imacat@yuki /tmp/postgresql-8.1.3 % make
make -C doc all
...
make[3]: Entering directory `/tmp/postgresql-8.1.3/src/pl/plpython'
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fpic
-I. -I/usr/include/python2.4 -I../../../src/include -D_GNU_SOURCE   -c
-o plpython.o plpython.c
ar crs libplpython.a `lorder plpython.o | tsort`
ranlib libplpython.a
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fpic
-shared -Wl,-soname,libplpython.so.0  plpython.o
-L/usr/lib/python2.4/config -L../../../src/port -lpython2.4 -lpthread
-ldl -lutil -lm -Wl,-rpath,/usr/lib/python2.4/config -o
libplpython.so.0.0
/usr/bin/ld: /usr/lib/python2.4/config/libpython2.4.a(abstract.o):
relocation R_X86_64_32 can not be used when making a shared object;
recompile with -fPIC
/usr/lib/python2.4/config/libpython2.4.a: could not read symbols: Bad
value
collect2: ld returned 1 exit status
make[3]: *** [libplpython.so.0.0] Error 1
make[3]: Leaving directory `/tmp/postgresql-8.1.3/src/pl/plpython'
make[2]: *** [all] Error 1
make[2]: Leaving directory `/tmp/postgresql-8.1.3/src/pl'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/tmp/postgresql-8.1.3/src'
make: *** [all] Error 2
imacat@yuki /tmp/postgresql-8.1.3 %
   I have recompiled my perl many times, with:

./Configure -Dusethreads -Dcc=gcc -Duselongdouble -Doptimize="-g -O3"
-Duse64bitint -Duse64bitall -Dprefix=/usr -Dd_dosuid
-Dotherlibdirs=/usr/share/perl5 -Dinc_version_list=none
-Acccdlflags=-fPIC -Duseshrplib=false
-Dcf_email=imacat@mail.imacat.idv.tw
   I've changed CFLAGS_SL to -fPIC in src/makefiles/Makefile.linux, and
it still doesn't help.

...
tsort: plperl.o
ranlib libplperl.a
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fPIC
-shared -Wl,-soname,libplperl.so.0  plperl.o spi_internal.o SPI.o
-L/usr/local/lib
-L/usr/lib/perl5/5.8.8/x86_64-linux-thread-multi-ld/CORE
-L../../../src/port /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi-ld/au
to/DynaLoader/DynaLoader.a -lperl -lnsl -ldl -lm -lcrypt -lutil
-lpthread -lc
-Wl,-rpath,/usr/lib/perl5/5.8.8/x86_64-linux-thread-multi-ld/CORE -o
libplperl.so.0.0
/usr/bin/ld: /usr/lib/perl5/5.8.8/x86_64-linux-thread-multi-ld/auto/Dyn
aLoader/DynaLoader.a(DynaLoader.o): relocation R_X86_64_32 can not be
used when making a shared object; recompile with -fPIC
/usr/lib/perl5/5.8.8/x86_64-linux-thread-multi-ld/auto/DynaLoader/DynaLoader.a:
could not read symbols: Bad value
collect2: ld returned 1 exit status
make[3]: *** [libplperl.so.0.0] Error 1
...

...
make[3]: Entering directory `/tmp/postgresql-8.1.3/src/pl/plpython'
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Winline
-Wdeclaration-after-statement -Wendif-labels -fno-strict-aliasing -fPIC
-shared -Wl,-soname,libplpython.so.0  plpython.o
-L/usr/lib/python2.4/config -L../../../src/port -lpython2.4 -lpthread
-ldl -lutil -lm -Wl,-rpath,/usr/lib/python2.4/config -o
libplpython.so.0.0
/usr/bin/ld: /usr/lib/python2.4/config/libpython2.4.a(abstract.o):
relocation R_X86_64_32 can not be used when making a shared object;
recompile with -fPIC
/usr/lib/python2.4/config/libpython2.4.a: could not read symbols: Bad
value
collect2: ld returned 1 exit status
make[3]: *** [libplpython.so.0.0] Error 1
...
   I'm out of ideas.  Is there anyone know which flags to add to or
where my mistake is?  Thank you.

--
Best regards,
imacat ^_*' <imacat@mail.imacat.idv.tw>
PGP Key: http://www.imacat.idv.tw/me/pgpkey.txt

<<Woman's Voice>> News: http://www.wov.idv.tw/
Tavern IMACAT's: http://www.imacat.idv.tw/
TLUG List Manager: http://lists.linux.org.tw/cgi-bin/mailman/listinfo/tlug

Re: Compiling PL/Perl and Pl/Python on x86_64

From
Tom Lane
Date:
imacat <imacat@mail.imacat.idv.tw> writes:
>     I cannot compile PL/Perl and PL/Python under x86_64.

Works fine for me (without any tinkering with flags) on Fedora Core 4.
Maybe you don't have 64-bit versions of the perl and python libraries?
        regards, tom lane


Re: Compiling PL/Perl and Pl/Python on x86_64

From
imacat
Date:
On Sun, 07 May 2006 13:09:48 -0400
Tom Lane <tgl@sss.pgh.pa.us> wrote:
> imacat <imacat@mail.imacat.idv.tw> writes:
> >     I cannot compile PL/Perl and PL/Python under x86_64.
> Works fine for me (without any tinkering with flags) on Fedora Core 4.
> Maybe you don't have 64-bit versions of the perl and python libraries?
   Will... thank you for the hint.  I have tested to build with the
precompiled binary perl 5.8.4 that comes with the Debian distribution,
and it works.  It now seems that the problem resides on my perl
compilation.  I'll go for that direction.

--
Best regards,
imacat ^_*' <imacat@mail.imacat.idv.tw>
PGP Key: http://www.imacat.idv.tw/me/pgpkey.txt

<<Woman's Voice>> News: http://www.wov.idv.tw/
Tavern IMACAT's: http://www.imacat.idv.tw/
TLUG List Manager: http://lists.linux.org.tw/cgi-bin/mailman/listinfo/tlug

Re: Compiling PL/Perl and Pl/Python on x86_64

From
imacat
Date:
On Mon, 08 May 2006 03:58:54 +0800
imacat <imacat@mail.imacat.idv.tw> wrote:
> On Sun, 07 May 2006 13:09:48 -0400
> Tom Lane <tgl@sss.pgh.pa.us> wrote:
> > imacat <imacat@mail.imacat.idv.tw> writes:
> > >     I cannot compile PL/Perl and PL/Python under x86_64.
> > Works fine for me (without any tinkering with flags) on Fedora Core 4.
>     Will... thank you for the hint.  I have tested to build with the
   I have successfully compiled with a shared Perl/Python libraries. 
Thank you for your hint.  But now I have another question.
   Why can't I link PL/Perl and PL/Python against the static
Perl/Python libraries, as I did on 32-bit machines?  I have added -fPIC
when linking Perl statically, but it still doesn't work.  Is ther any
reason that it doesn't work to link that way?

--
Best regards,
imacat ^_*' <imacat@mail.imacat.idv.tw>
PGP Key: http://www.imacat.idv.tw/me/pgpkey.txt

<<Woman's Voice>> News: http://www.wov.idv.tw/
Tavern IMACAT's: http://www.imacat.idv.tw/
TLUG List Manager: http://lists.linux.org.tw/cgi-bin/mailman/listinfo/tlug

Re: Compiling PL/Perl and Pl/Python on x86_64

From
imacat
Date:
On Sun, 21 May 2006 16:35:24 -0700 (PDT)
gede wawan <gde_wawan@yahoo.com> wrote:
> relocation R_X86_64_32 can not be used when making a shared object;
> recompile with -fPIC
   May I ask how?  I have tried to edit src/makefiles/Makefile.linux
and changed -fpic to -fPIC, but it does not help.  Maybe I should set
the flag elsewhere?
   Actually, I have made some tests.  I found that in the PostgreSQL
document, Perl must be built as shared library:

> 14.2. Requirements
> To build the server programming language PL/Perl you need a full Perl
> installation, including the libperl library and the header files. Since
> PL/Perl will be a shared library, the  libperl library must be a shared
> library also on most platforms. This appears to be the default in recent
> Perl versions, but it was not in earlier versions, and in any case it is
> the choice of whomever installed Perl at your site.
   But, on my i386 machine, I can build PL/Perl with static library
(libperl.a).  But I can't do that on x86_64 anymore.  Can somebody tell
me why, or where should I referring to?
   The same issue goes to PL/Python.  I'm not good at Python, but I
know that I was building static library before, and it works for
PL/Python on i386.  But it does not work anymore on x86_64, too.

--
Best regards,
imacat ^_*' <imacat@mail.imacat.idv.tw>
PGP Key: http://www.imacat.idv.tw/me/pgpkey.txt

<<Woman's Voice>> News: http://www.wov.idv.tw/
Tavern IMACAT's: http://www.imacat.idv.tw/
TLUG List Manager: http://lists.linux.org.tw/cgi-bin/mailman/listinfo/tlug

Re: Compiling PL/Perl and Pl/Python on x86_64

From
Andrew Dunstan
Date:
imacat wrote:
>     But, on my i386 machine, I can build PL/Perl with static library
> (libperl.a).  But I can't do that on x86_64 anymore.  Can somebody tell
> me why, or where should I referring to?
>   

Why do you want to do this? It works perfectly well with a shared lib, 
and is probably more memory efficient and faster to load.

cheers

andrew




Re: Compiling PL/Perl and Pl/Python on x86_64

From
Theo Schlossnagle
Date:
Andrew Dunstan wrote:

> imacat wrote:
>
>>     But, on my i386 machine, I can build PL/Perl with static library
>> (libperl.a).  But I can't do that on x86_64 anymore.  Can somebody tell
>> me why, or where should I referring to?
>>   
>
>
> Why do you want to do this? It works perfectly well with a shared lib, 
> and is probably more memory efficient and faster to load.

I assume this is for the performance gains that can be seen by loading 
non-PIC code over PIC code.  However, this is not an option on x86_64.  
Dynamically loaded code must be compiled with PIC on pretty much every 
platform except 32-bit intel.

The bigger puzzle is why you could link against non-PIC code in shared 
objects on 32-bit x86.  (I know the answer, but it has no real merit).  
If you want things dynamically loadable, they must be PIC.

-- 
// Theo Schlossnagle
// Principal Engineer -- http://www.omniti.com/~jesus/
// Ecelerity: Run with it. -- http://www.omniti.com/