Bug #448: 7.1.3 interfaces build fail on solaris w. gcc

Started by PostgreSQL Bugs Listover 24 years ago2 messagesbugs
Jump to latest
#1PostgreSQL Bugs List
pgsql-bugs@postgresql.org

Bob Deblier (bob@virtualunlimited.com) reports a bug with a severity of 1
The lower the number the more severe it is.

Short Description
7.1.3 interfaces build fail on solaris w. gcc

Long Description
I've been having problems with doing a dlopen() of libpsqlodbc since version 7.1; now that I wanted to trace the probem I find the following problem during the build:

make[2]: Entering directory `/opt/gnutools/postgresql-7.1.3/src/interfaces/odbc'
gcc -Wall -Wmissing-prototypes -Wmissing-declarations -fPIC -G -Wl,-soname,libpsqlodbc.so.0 -Wl,-Bsymbolic info.o bind.o columninfo.o connection.o convert.o drvconn.o environ.o execute.o lobj.o misc.o options.o pgtypes.o psqlodbc.o qresult.o results.o socket.o parse.o statement.o gpps.o tuple.o tuplelist.o dlg_specific.o multibyte.o -lm -lm -lc -Wl,-rpath,/opt/pgsql/lib -o libpsqlodbc.so.0.26
/usr/lib/gcc-lib/sparc-sun-solaris2.8/2.95.3/crt1.o: In function `nope':
/usr/lib/gcc-lib/sparc-sun-solaris2.8/2.95.3/crt1.o(.text+0x5c): undefined reference to `main'
socket.o: In function `SOCK_connect_to':
socket.o(.text+0x280): undefined reference to `inet_addr'
socket.o(.text+0x2a0): undefined reference to `gethostbyname'
socket.o(.text+0x354): undefined reference to `socket'
socket.o(.text+0x3b8): undefined reference to `connect'
socket.o: In function `SOCK_flush_output':
socket.o(.text+0x92c): undefined reference to `send'
socket.o: In function `SOCK_get_next_byte':
socket.o(.text+0x9e0): undefined reference to `recv'
socket.o: In function `SOCK_put_next_byte':
socket.o(.text+0xb80): undefined reference to `send'

This shouldn't be too hard to fix by adding the -lsocket and -lnsl libraries.

Furthermore the dynamic linking of libraries is wrong. You use the -G option, which is appropriate for Sun's compilers, but not for gcc. With gcc, you have to use the '-shared' option.

Hence all shared libraries fail to build because with a missing 'main' symbol. When this happens, the make process just continues, instead of aborting with an error. Maybe you should switch to building with libtool?

Anyway, I'd appreciate it if I could directions to fix these problems.

Sample Code

No file was uploaded with this report

#2Peter Eisentraut
peter_e@gmx.net
In reply to: PostgreSQL Bugs List (#1)
Re: Bug #448: 7.1.3 interfaces build fail on solaris w. gcc

Bob Deblier (bob@virtualunlimited.com) reports a bug with a severity of 1

This shouldn't be too hard to fix by adding the -lsocket and -lnsl libraries.

Done.

Furthermore the dynamic linking of libraries is wrong. You use the -G
option, which is appropriate for Sun's compilers, but not for gcc.
With gcc, you have to use the '-shared' option.

GCC documents -G for shared libraries, and people have been using that for
years. But it's probably not worth figuring this out since -shared is
clearly preferred.

Hence all shared libraries fail to build because with a missing 'main'
symbol. When this happens, the make process just continues, instead of
aborting with an error.

Hmm, that's an interesting effect.

Maybe you should switch to building with libtool?

Nope. ;-)

Anyway, I'd appreciate it if I could directions to fix these problems.

1. in src/interfaces/odbc/GNUmakefile, change

SHLIB_LINK = $(filter -lm, $(LIBS))
to
SHLIB_LINK = $(filter -lm -lnsl -lsocket, $(LIBS))

2. in src/Makefile.shlib, change

LINK.shared = $(COMPILER) -G

into

ifndef cplusplus
ifeq ($(GCC), yes)
LINK.shared = $(CC) -shared
else
LINK.shared = $(CC) -G
endif
else
ifeq ($(GXX), yes)
LINK.shared = $(CXX) -shared
else
LINK.shared = $(CXX) -G
endif
endif

(Or just change the -G if you don't care about generality.)

--
Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter