Thread: Threading with non-shared libraries
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
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/
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
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