Re: 8.0.0beta1: -lpthread missing

From: Martin Münstermann <mmuenstermann(at)betrusted(dot)com>
To: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
Cc: Robert Treat <xzilla(at)users(dot)sourceforge(dot)net>, pgsql-bugs(at)postgresql(dot)org
Subject: Re: 8.0.0beta1: -lpthread missing
Date: 2004-08-12 06:42:15
Message-ID: 411B1147.9000303@betrusted.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-patches pgsql-www

Bruce Momjian wrote:
> OK, I have some more information. Basically, the config/acx_pthread.m4
> manual page (http://www.gnu.org/software/ac-archive/htmldoc/acx_pthread.h=
> tml)
> says:
> =09
> NOTE: You are assumed to not only compile your program with these flags,
> but also link it with them as well. e.g. you should link with
> $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
>
> meaning if -lpthread is defined in PTHREAD_CFLAGS, it also has to be
> included in the link. Now, from your reports you said -lpthread was in
> PTHREAD_CFLAGS, so why isn't it also included in the libpq link line. I
> need to see your link line output for libpq.

OK, here are parts of the output from configure --enable-thread-safety
on Debian:
[...]
checking for the pthreads library -lpthreads... no
checking whether pthreads work without any flags... no
checking whether pthreads work with -Kthread... no
checking whether pthreads work with -kthread... no
checking for the pthreads library -llthread... no
checking whether pthreads work with -pthread... yes
checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE
checking if more special flags are required for pthreads... no
checking for cc_r... gcc
checking pthread.h usability... yes
checking pthread.h presence... yes
checking for pthread.h... yes
[...]
--> configure thays, thate the CFLAG -pthread is sufficient.

Makefile.global:
PTHREAD_CFLAGS = -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS
PTHREAD_LIBS =

Let's look what make is doing:
[...]
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -I../../src/port -I../../src/include
-D_GNU_SOURCE -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -c thread.c
ar crs libpgport.a dirmod.o exec.o noblock.o path.o pipe.o pgsleep.o
pgstrcasecmp.o sprompt.o thread.o

[...]

make[2]: Entering directory
`/home/user/checkout/postgresql-8.0.0beta1/src/interfaces'
make[3]: Entering directory
`/home/user/checkout/postgresql-8.0.0beta1/src/interfaces/libpq'
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-auth.o fe-auth.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-connect.o
fe-connect.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-exec.o fe-exec.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-misc.o fe-misc.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-print.o fe-print.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-lobj.o fe-lobj.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-protocol2.o
fe-protocol2.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-protocol3.o
fe-protocol3.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o pqexpbuffer.o
pqexpbuffer.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o pqsignal.o pqsignal.c
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o fe-secure.o fe-secure.c
rm -f dllist.c && ln -s ../../../src/backend/lib/dllist.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o dllist.o dllist.c
rm -f md5.c && ln -s ../../../src/backend/libpq/md5.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o md5.o md5.c
rm -f ip.c && ln -s ../../../src/backend/libpq/ip.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o ip.o ip.c
rm -f wchar.c && ln -s ../../../src/backend/utils/mb/wchar.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o wchar.o wchar.c
rm -f encnames.c && ln -s ../../../src/backend/utils/mb/encnames.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o encnames.o encnames.c
rm -f noblock.c && ln -s ../../../src/port/noblock.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o noblock.o noblock.c
rm -f pgstrcasecmp.c && ln -s ../../../src/port/pgstrcasecmp.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o pgstrcasecmp.o
pgstrcasecmp.c
rm -f thread.c && ln -s ../../../src/port/thread.c .
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -I. -I../../../src/include
-D_GNU_SOURCE -I../../../src/port -DFRONTEND -c -o thread.o thread.c
ar crs libpq.a `lorder fe-auth.o fe-connect.o fe-exec.o fe-misc.o
fe-print.o fe-lobj.o fe-protocol2.o fe-protocol3.o pqexpbuffer.o
pqsignal.o fe-secure.o dllist.o md5.o ip.o wchar.o encnames.o noblock.o
pgstrcasecmp.o thread.o | tsort`
ranlib libpq.a
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -shared -Wl,-soname,libpq.so.3
fe-auth.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-lobj.o
fe-protocol2.o fe-protocol3.o pqexpbuffer.o pqsignal.o fe-secure.o
dllist.o md5.o ip.o wchar.o encnames.o noblock.o pgstrcasecmp.o thread.o
-L../../../src/port -lcrypt -lresolv -lnsl
-Wl,-rpath,/opt/postgresql-800beta1/lib -o libpq.so.3.2
rm -f libpq.so.3
ln -s libpq.so.3.2 libpq.so.3
rm -f libpq.so
ln -s libpq.so.3.2 libpq.so
make[3]: Leaving directory
`/home/user/checkout/postgresql-8.0.0beta1/src/interfaces/libpq'

So the shared library is built with "-pthread"
[...]

gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations initdb.o dirmod.o exec.o
-L../../../src/interfaces/libpq -lpq -L../../../src/port
-Wl,-rpath,/opt/postgresql-800beta1/lib -lpgport -lz -lreadline -lcrypt
-lresolv -lnsl -ldl -lm -o initdb

[--> results in linker error as described in the first posting]

The problem can be resolved, if I modify my Makefile.global to
PTHREAD_LIBS = -lpthread

Then libpq.so is built with -lpthread (note the "l"):
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations -pthread -D_REENTRANT -D_THREAD_SAFE
-D_POSIX_PTHREAD_SEMANTICS -fpic -shared -Wl,-soname,libpq.so.3
fe-auth.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-lobj.o
fe-protocol2.o fe-protocol3.o pqexpbuffer.o pqsignal.o fe-secure.o
dllist.o md5.o ip.o wchar.o encnames.o noblock.o pgstrcasecmp.o thread.o
-L../../../src/port -lcrypt -lresolv -lnsl -lpthread
-Wl,-rpath,/opt/postgresql-800beta1/lib -o libpq.so.3.2

The link line of initdb is unchanged, with the difference that there is
no error:
gcc -O2 -fno-strict-aliasing -Wall -Wmissing-prototypes
-Wmissing-declarations initdb.o dirmod.o exec.o
-L../../../src/interfaces/libpq -lpq -L../../../src/port
-Wl,-rpath,/opt/postgresql-800beta1/lib -lpgport -lz -lreadline -lcrypt
-lresolv -lnsl -ldl -lm -o initdb

So for me it looks like in my case it's not sufficient to have the
compiler flag "-pthread", but also (or instead?) the linker flag
"-lpthread".
Maybe the case of a shared library using pthreads is not handled
correctly in the m4 macro?

Regards,
Martin

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Hans-Jürgen Schönig 2004-08-12 06:52:53 Re: Regression failure with PostgreSQL 8beta1 and Intel
Previous Message David Fetter 2004-08-12 06:11:58 Re: postgres 7.1.3 wth perl 5.8.0

Browse pgsql-patches by date

  From Date Subject
Next Message Fabien COELHO 2004-08-12 07:34:16 Re: more massaging on pgxs postresql extension infrastructure
Previous Message Michael Glaesemann 2004-08-12 05:32:47 to_timestamp overloaded to convert from Unix epoch

Browse pgsql-www by date

  From Date Subject
Next Message Dave Page 2004-08-12 07:39:10 Re: Event item duplication
Previous Message Peter Eisentraut 2004-08-12 05:31:09 Re: Request for download stats on release