Thread: Threading with non-shared libraries

Threading with non-shared libraries

From
Bruce Momjian
Date:
OK, it took me a while to figure this out, but it is similar to the
problem we have on AIX.  AIX shared libraries don't track other
libraries needed by the shared library, and non-shared libraries also
have no such dependency information.

I have attached a patch that is very similar to the AIX fix.  It
basically propagates the thread library flags to all uses of libpq.

Would you please test and report back?  Thanks.

---------------------------------------------------------------------------

Frank van Vugt wrote:
> L.S.
>
> I noticed the following :
>
>
> Workstation used to build RC1:
>
>     2.4.21-260-athlon, i686 athlon i386 GNU/Linux
>
>
> Configured with :
>
>     ./configure
>         --enable-thread-safety
>         --disable-shared
>         --prefix=/usr/src/postgresql/install
>
>
> Error during make install :
>
>     in directory src/bin/pg_ctl
>
> gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wendif-labels
> -fno-strict-aliasing pg_ctl.o  -L../../../src/interfaces/libpq -lpq
> -L../../../src/port  -Wl,-rpath,/usr/src/postgresql/install/lib -lpgport -lz
> -lreadline -lcrypt -lresolv -lnsl -ldl -lm  -o pg_ctl
> ../../../src/interfaces/libpq/libpq.a(fe-secure.o)(.text+0x140): In function
> `pq_block_sigpipe':
> : undefined reference to `pthread_sigmask'
> ../../../src/interfaces/libpq/libpq.a(fe-secure.o)(.text+0x1e0): In function
> `pq_reset_sigpipe':
> : undefined reference to `pthread_sigmask'
> collect2: ld gaf exit-status 1 terug
>
>
> There seems to be a missing option '-lpthread' here, adding it properly links
> the file.
>
> The same goes for pg_restore, pg_dumpall, psql, createdb, createlang,
> createuser, dropdb, droplang, dropuser, clusterdb and vacuumdb.
>
>
>
>
>
> --
> Best,
>
>
>
>
> Frank.
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 9: the planner will ignore your desire to choose an index scan if your
>       joining column's datatypes do not match
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/Makefile.global.in
===================================================================
RCS file: /cvsroot/pgsql/src/Makefile.global.in,v
retrieving revision 1.205
diff -c -c -r1.205 Makefile.global.in
*** src/Makefile.global.in    19 Nov 2004 00:41:38 -0000    1.205
--- src/Makefile.global.in    14 Dec 2004 22:49:42 -0000
***************
*** 308,313 ****
--- 308,319 ----

  libpq = -L$(libpq_builddir) -lpq

+ # If doing static linking, shared library dependency can't be
+ # used so we specify pthread libs for every usage of libpq.
+ ifeq ($(enable_shared), no)
+ libpq += $(PTHREAD_LIBS)
+ endif
+
  submake-libpq:
      $(MAKE) -C $(libpq_builddir) all


Re: Threading with non-shared libraries

From
Peter Eisentraut
Date:
Bruce Momjian wrote:
> OK, it took me a while to figure this out, but it is similar to the
> problem we have on AIX.  AIX shared libraries don't track other
> libraries needed by the shared library, and non-shared libraries also
> have no such dependency information.

I'm pretty sure that static linking is completely broken for nontrivial
configurations because of this issue.  If we want to support that, we
should do an all-out fix, not a fix for one library and one platform.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

Re: Threading with non-shared libraries

From
Bruce Momjian
Date:
Peter Eisentraut wrote:
> Bruce Momjian wrote:
> > OK, it took me a while to figure this out, but it is similar to the
> > problem we have on AIX.  AIX shared libraries don't track other
> > libraries needed by the shared library, and non-shared libraries also
> > have no such dependency information.
>
> I'm pretty sure that static linking is completely broken for nontrivial
> configurations because of this issue.  If we want to support that, we
> should do an all-out fix, not a fix for one library and one platform.

Right.  My idea is that we need that code on AIX or when doing static
builds on any platform.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Threading with non-shared libraries

From
Bruce Momjian
Date:
OK, applied.  I got a private email from the poster stating the patch
works for him.  The final patch is slightly different because of the AIX
test.

---------------------------------------------------------------------------

Index: Makefile.global.in
===================================================================
RCS file: /cvsroot/pgsql/src/Makefile.global.in,v
retrieving revision 1.206
diff -c -r1.206 Makefile.global.in
*** Makefile.global.in    16 Dec 2004 17:48:29 -0000    1.206
--- Makefile.global.in    16 Dec 2004 18:12:55 -0000
***************
*** 308,318 ****
--- 308,324 ----

  libpq = -L$(libpq_builddir) -lpq

+ # If doing static linking, shared library dependency can't be
+ # used so we specify pthread libs for every usage of libpq
+ ifeq ($(enable_shared), no)
+ libpq += $(PTHREAD_LIBS)
+ else
  # AIX libraries do not remember their required libs so we have to force
  # thread dependent libraires in the link
  ifeq ($(PORTNAME), aix)
  libpq += $(PTHREAD_LIBS)
  endif
+ endif

  submake-libpq:
      $(MAKE) -C $(libpq_builddir) all


---------------------------------------------------------------------------

Bruce Momjian wrote:
>
> OK, it took me a while to figure this out, but it is similar to the
> problem we have on AIX.  AIX shared libraries don't track other
> libraries needed by the shared library, and non-shared libraries also
> have no such dependency information.
>
> I have attached a patch that is very similar to the AIX fix.  It
> basically propagates the thread library flags to all uses of libpq.
>
> Would you please test and report back?  Thanks.
>
> ---------------------------------------------------------------------------
>
> Frank van Vugt wrote:
> > L.S.
> >
> > I noticed the following :
> >
> >
> > Workstation used to build RC1:
> >
> >     2.4.21-260-athlon, i686 athlon i386 GNU/Linux
> >
> >
> > Configured with :
> >
> >     ./configure
> >         --enable-thread-safety
> >         --disable-shared
> >         --prefix=/usr/src/postgresql/install
> >
> >
> > Error during make install :
> >
> >     in directory src/bin/pg_ctl
> >
> > gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wendif-labels
> > -fno-strict-aliasing pg_ctl.o  -L../../../src/interfaces/libpq -lpq
> > -L../../../src/port  -Wl,-rpath,/usr/src/postgresql/install/lib -lpgport -lz
> > -lreadline -lcrypt -lresolv -lnsl -ldl -lm  -o pg_ctl
> > ../../../src/interfaces/libpq/libpq.a(fe-secure.o)(.text+0x140): In function
> > `pq_block_sigpipe':
> > : undefined reference to `pthread_sigmask'
> > ../../../src/interfaces/libpq/libpq.a(fe-secure.o)(.text+0x1e0): In function
> > `pq_reset_sigpipe':
> > : undefined reference to `pthread_sigmask'
> > collect2: ld gaf exit-status 1 terug
> >
> >
> > There seems to be a missing option '-lpthread' here, adding it properly links
> > the file.
> >
> > The same goes for pg_restore, pg_dumpall, psql, createdb, createlang,
> > createuser, dropdb, droplang, dropuser, clusterdb and vacuumdb.
> >

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073