I have now recompiled openldap into 2 versions
# export CFLAGS="-D_AVL_H" # make distclean && ./configure --prefix=/usr/local/opt/openldap/openldap-2.3.30-shared --enable-ldap --enable-slapd=no --enable-static=no --enable-shared=yes && make depend && make
and
# export CFLAGS="-D_AVL_H" # make distclean && ./configure --prefix=/usr/local/opt/openldap/openldap-2.3.30-static --enable-ldap --enable-slapd=no --enable-static=yes --enable-shared=no && make depend && make
The results with the shared ones are : $ /usr/sfw/bin/gcc -I/usr/local/opt//openldap/openldap-2.3.30-shared/include /usr/local/opt/openldap/openldap-2.3.30-shared/lib/libldap.so ldaptest.c -o ldaptest $ ldd ldaptest libldap-2.3.so.0 => (file not found) libc.so.1 => /lib/libc.so.1 libm.so.2 => /lib/libm.so.2
The results with the static ones are : $ /usr/sfw/bin/gcc -I/usr/local/opt//openldap/openldap-2.3.30-static/include /usr/local/opt/openldap/openldap-2.3.30-static/lib/libldap.a ldaptest.c -o ldaptest Undefined first referenced symbol in file ldap_dn2ad_canonical /var/tmp//cco5elQD.o ld: fatal: Symbol referencing errors. No output written to ldaptest collect2: ld returned 1 exit status
Running nm on libldap.a gives: $ /usr/ccs/bin/nm /usr/local/opt/openldap/openldap-2.3.30-static/lib/libldap.a | grep _dn2ad [57] | 3116| 120|FUNC |GLOB |0 |1 |ldap_dn2ad_canonical
So there is something odd here.
-----Original Message----- From: Aaron Richton [mailto:richton@nbcs.rutgers.edu] Sent: 07 December 2006 14:32 To: Robert Bannocks Cc: openldap-software@openldap.org Subject: RE: Solaris 10 and openldap - help needed.
Maybe. Is the symbol actually in your libldap.a? e.g.
$ nm /usr/local/lib/libldap.a | grep _dn2ad_ [118] | 134| 21|OBJT |GLOB |0 |5 |$XBGxIqAd5tbFHwZ.ldap_dn2ad_canonical.__func__ [117] | 3136| 124|FUNC |GLOB |0 |2 |ldap_dn2ad_canonical
If you're seeing good results with --enable-shared=yes, maybe try different config lines that build both the static and shared. I don't immedately see how that would matter, but autoconf might be turning
off
some part you need. Bottom line, I can get your sample program to
compile
(I don't have static libsasl2.a, it'd be fairly meaningless), as
below.
I'd also be wary that your .a file is a real archive and not some
magical
libtool wrapper, and that it didn't get borked by a program like GNU
strip
(which, historically at least, has been very dangerous on Solaris).
$ /opt/SUNWspro/bin/cc -I/usr/local/include -{L,R}/usr/local/lib foo.c /usr/local/lib/lib{ldap,lber}.a /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a -lsasl2 -lnsl -lsocket -lresolv -o foo "foo.c", line 4: warning: old-style declaration or incorrect type for: main $ ldd foo # no libldap.so libsasl2.so.2 => /usr/local/lib/libsasl2.so.2 libnsl.so.1 => /usr/lib/libnsl.so.1 libsocket.so.1 => /usr/lib/libsocket.so.1 libresolv.so.2 => /usr/lib/libresolv.so.2 libc.so.1 => /usr/lib/libc.so.1 libdl.so.1 => /usr/lib/libdl.so.1 libmp.so.2 => /usr/lib/libmp.so.2 /usr/platform/SUNW,Sun-Fire-V210/lib/libc_psr.so.1
$ gcc -R/usr/local/lib foo.c /usr/local/lib/lib{ldap,lber}.a /usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a -lsasl2
-lnsl
-lsocket -lresolv -o foo $ ldd foo libsasl2.so.2 => /usr/local/lib/libsasl2.so.2 libnsl.so.1 => /usr/lib/libnsl.so.1 libsocket.so.1 => /usr/lib/libsocket.so.1 libresolv.so.2 => /usr/lib/libresolv.so.2 libc.so.1 => /usr/lib/libc.so.1 libdl.so.1 => /usr/lib/libdl.so.1 libmp.so.2 => /usr/lib/libmp.so.2 /usr/platform/SUNW,Sun-Fire-V210/lib/libc_psr.so.1
On Thu, 7 Dec 2006, Robert Bannocks wrote:
I *am* trying to use static libraries. Appols for the confusion
over
the -L and -l. I am now trying things more directly:
$ /usr/sfw/bin/gcc -I/usr/local/opt/openldap/openldap-2.3.27/include /usr/local/opt/openldap/openldap-2.3.27/lib/libldap.a /usr/local/opt/openldap/openldap-2.3.27/lib/liblber.a ldaptest.c Undefined first referenced symbol in file ldap_dn2ad_canonical /var/tmp//ccUaa9gP.o ld: fatal: Symbol referencing errors. No output written to a.out collect2: ld returned 1 exit status
Doing this with 2.3.30 is no help either:
$ /usr/sfw/bin/gcc -I/usr/local/opt/openldap/openldap-2.3.30/include /usr/local/opt/openldap/openldap-2.3.30/lib/libldap.a /usr/local/opt/openldap/openldap-2.3.30/lib/liblber.a ldaptest.c Undefined first referenced symbol in file ldap_dn2ad_canonical /var/tmp//cc2EWpQ9.o ld: fatal: Symbol referencing errors. No output written to a.out collect2: ld returned 1 exit status
Why is this symbol not found with the static libraries? With the dynamic ones things go fine:
$ /usr/sfw/bin/gcc -I/usr/local/opt/openldap/openldap-2.3.27/include /usr/local/opt/openldap/openldap-2.3.27/lib/libldap.so /usr/local/opt/openldap/openldap-2.3.27/lib/liblber.so ldaptest.c $ ldd a.out libldap-2.3.so.0 => (file not found) liblber-2.3.so.0 => (file not found) libc.so.1 => /lib/libc.so.1 libm.so.2 => /lib/libm.so.2
I believe that this is an openldap issue not a Solaris one.
Regards,
Rob
-----Original Message----- From: Aaron Richton [mailto:richton@nbcs.rutgers.edu] Sent: 06 December 2006 22:46 To: Robert Bannocks Cc: openldap-software@openldap.org; Quanah Gibson-Mount Subject: Re: Solaris 10 and openldap - help needed.
With the command line /usr/sfw/bin/gcc
-I/usr/local/opt//openldap/openldap-2.3.27/include
-L/usr/local/opt/openldap/openldap-2.3.27/lib/libldap.a -L/usr/local/opt/openldap-2.3.27/lib/liblber.a ldaptest.c
Your paths on your -L lines don't match.
For that matter, I think you're confusing big L with little l.
Typically
you'd, assuming those paths are right,
gcc -I/usr/local/opt/openldap/openldap-2.3.27/include - L/usr/local/opt/openldap/openldap-2.3.27/lib -lldap -llber
ldaptest.c
big L is search path, little l is library name (-lfoo =>
libfoo.{a,so})
Looks like you're trying to use .a static libraries. If you use .so
shared
libraries, you'll probably want an RPATH. You can Google for that
or
ask
the Solaris community for help.