Thanks,
Meng
gcc -c c_link_test.c
gcc -v -ldl c_link_test.o -o c_link_test
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/specs
Configured with: ../configure --disable-nls --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld
Thread model: posix
gcc version 3.2.3
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/collect2 -V -Y P,/usr/ccs/lib:/usr/lib -Qy -o c_link_test /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crt1.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crti.o /usr/ccs/lib/values-Xa.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crtbegin.o -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3 -L/usr/ccs/bin -L/usr/ccs/lib -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/../../.. -ldl c_link_test.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh -lc /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crtend.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crtn.o
ld: Software Generation Utilities - Solaris Link Editors: 5.8-1.282
ld: fatal: library -ldl: not found
ld: fatal: File processing errors. No output written to c_link_test
collect2: ld returned 1 exit status
truss -f -o out `which gcc` -v -ldl c_link_test.o -o c_link_test
SAME MESSAGE ABOVE
grep libdl out
6411: stat("/usr/lib/libdl.so.1", 0xFFBEE98C) = 0
6411: open("/usr/lib/libdl.so.1", O_RDONLY) = 3
6412: stat("/usr/lib/libdl.so.1", 0xFFBEE20C) = 0
6412: open("/usr/lib/libdl.so.1", O_RDONLY) = 3
6414: stat("/usr/lib/libdl.so.1", 0xFFBEDFB4) = 0
6414: open("/usr/lib/libdl.so.1", O_RDONLY) = 6
6414: open("/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/ccs/bin/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/ccs/lib/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/../../../libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/lib/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/openwin/lib/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/openwin/lib/X11/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/lib/X11/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/openwin/lib/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("~/lib/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/X/lib/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/openwin/lib/X11/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/ccs/lib/libdl.a", O_RDONLY) Err#2 ENOENT
6414: open("/usr/lib/libdl.a", O_RDONLY) Err#2 ENOENT
----- Original Message -----
From: Andy Howell <AndyHowell@austin.rr.com>
Date: Thu, 31 Jul 2003 23:01:15 -0500
To: Meng-Hsueh Chiang <mhchiang@mail.com>
Subject: Re: Static library for gcc compiling
Meng-Hsueh Chiang,
I made a little test:
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
main()
{
dlopen("you wont find me", RTLD_NOW);
printf("Link me\n");
}
compiled it:
gcc -c c_link_test.c
Then linked it:
gcc -v -ldl c_link_test.o -o c_link_test
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/specs
Configured with: ../configure --disable-nls --with-as=/usr/ccs/bin/as
--with-ld=/usr/ccs/bin/ld
Thread model: posix
gcc version 3.3
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/collect2 -V -Y
P,/usr/ccs/lib:/usr/lib -Qy -o c_link_test
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/crt1.o
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/crti.o
/usr/ccs/lib/values-Xa.o
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/crtbegin.o
-L/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3 -L/usr/ccs/bin
-L/usr/ccs/lib
-L/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/../../.. -ldl
c_link_test.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh -lc
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/crtend.o
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/crtn.o
ld: Software Generation Utilities - Solaris Link Editors: 5.8-1.279
ldd ./c_link_test
libdl.so.1 => /usr/lib/libdl.so.1
libc.so.1 => /usr/lib/libc.so.1
Aside from different files names and extra libs in your case, I can't
see what the difference is. I have a newer compiler, 3.3, and you have a
newer linker. Collect2 searches for c++ constructors and creates a c
fiel containing them, compiles it, and then passes it to the linker. I
was trying to find what its options mean, but only came across the above
description. The only other thing I can suggest is run truss on gcc to
see what it is doing:
truss -f -o out `which gcc` -v -ldl c_link_test.o -o c_link_test
This traces the system calls that gcc and it children (-f) are making
and writes them to the file out (-o).
"grep libdl out" shows where it is looking for libdl.so. Here is the
tail end of the search on my box:
586: open("/usr/local/lib/libdl.so", O_RDONLY) Err#2 ENOENT
1586: open("/usr/local/lib/libdl.a", O_RDONLY) Err#2 ENOENT
1586: open("./libdl.so", O_RDONLY) Err#2 ENOENT
1586: open("./libdl.a", O_RDONLY) Err#2 ENOENT
1586: open("/usr/ccs/lib/libdl.so", O_RDONLY) Err#2 ENOENT
1586: open("/usr/ccs/lib/libdl.a", O_RDONLY) Err#2 ENOENT
1586: open("/usr/lib/libdl.so", O_RDONLY) = 7
Sorry I can't give you a better answer. Maybe someone on the list can help.
Andy
Andy,
I tried the gcc command and made it all dynamic, so it should not have any issue with static -ldl.
But it still said -ldl not found as follow (-v mode was used for your information).
Could you please give me some clue? I sincerely appreciate that.
Meng
gcc -v -o spice3 spice3.o ./../../src/lib/misc.a -L/usr/openwin/lib -lXaw -lXt -lXext -lXmu -lX11 -lm -ltermlib -lsocket -lnsl -ldl
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/specs
Configured with: ../configure --disable-nls --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld
Thread model: posix
gcc version 3.2.3
/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/collect2 -V -Y P,/usr/ccs/lib:/usr/lib -Qy -o spice3 /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crt1.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crti.o /usr/ccs/lib/values-Xa.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crtbegin.o -L/usr/openwin/lib -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3 -L/usr/ccs/bin -L/usr/ccs/lib -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/../../.. spice3.o ./../../src/lib/misc.a -lXaw -lXt -lXext -lXmu -lX11 -lm -ltermlib -lsocket -lnsl -ldl -lgcc -lgcc_eh -lc -lgcc -lgcc_eh -lc /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crtend.o /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2.3/crtn.o
ld: Software Generation Utilities - Solaris Link Editors: 5.8-1.282
ld: fatal: library -ldl: not found
ld: fatal: File processing errors. No output written to spice3
collect2: ld returned 1 exit status
----- Original Message -----
From: Andy Howell <AndyHowell@austin.rr.com>
Date: Thu, 31 Jul 2003 11:09:08 -0500
To: Meng-Hsueh Chiang <mhchiang@mail.com>
Subject: Re: Static library for gcc compiling
Meng-Hsueh Chiang wrote:
Thank you Andy for your helpful suggestion.
It did finish the compiling. But when I ran the executable, core dumped.
Somehow, long time ago, I could compile it on my previous machine with
gcc -o spice spice3.o ./../../src/lib/misc.a -L/usr/lib -lXaw -lXt -lXext -lXmu -lX11 -lw -lm -ltermlib -lsocket -lnsl -ldl
and got no complaint (I didn't see the problem before).
Ok, no directives on the compile command to make it static, so its all
dynamic. Looks fine.
ldd spice
libXaw.so.5 => /usr/lib/libXaw.so.5
libXt.so.4 => /usr/lib/libXt.so.4
libXext.so.0 => /usr/lib/libXext.so.0
libXmu.so.4 => /usr/lib/libXmu.so.4
libX11.so.4 => /usr/lib/libX11.so.4
libw.so.1 => /usr/lib/libw.so.1
libm.so.1 => /usr/lib/libm.so.1
libcurses.so.1 => /usr/lib/libcurses.so.1
libsocket.so.1 => /usr/lib/libsocket.so.1
libnsl.so.1 => /usr/lib/libnsl.so.1
libdl.so.1 => /usr/lib/libdl.so.1
libc.so.1 => /usr/lib/libc.so.1
libSM.so.6 => /usr/lib/libSM.so.6
libICE.so.6 => /usr/lib/libICE.so.6
libdga.so.1 => /usr/openwin/lib/libdga.so.1
libmp.so.2 => /usr/lib/libmp.so.2
/usr/platform/SUNW,Sun-Blade-1000/lib/libc_psr.so.1
But now with Xlinker (as you suggeted in order to overcome -ldl issue)
gcc -o spice spice.o ./../../src/lib/misc.a -L/usr/lib -lXaw -lXt -lXext -Bstatic -lXmu -Bdynamic -lX11 -lm -ltermlib -lsocket -lnsl -Xlinker -B -Xlinker dynamic -ldl -Xlinker -B -Xlinker static
ldd spice
libdl.so.1 => /usr/lib/libdl.so.1
Hmm, thats kind of wierd. I would have expected lib Xmu to be static and
everything else to be dynamic. Try -v on the compile line, I think that
shows what it being passed to the linker.
The library list is a lot shorter. Seems strange? Could you please give me some clues?
Also, what would be causing the -ldl issue for my new system ? I know the SunOS, and gcc
are different.
I have made Solaris 5.8 binaries with mixed dynamic and static libs, so
I know that it works. The trick is getting options in the right order...
Andy
Thanks a lot,
Meng
----- Original Message -----
From: Andy Howell <AndyHowell@austin.rr.com>
Date: Wed, 30 Jul 2003 22:55:13 -0500
To: Meng-Hsueh Chiang <mhchiang@mail.com>
Subject: Re: Static library for gcc compiling
Meng-Hsueh Chiang wrote:
I am getting undefined symbol (_dlclose, _dlopen, _dlsym) errors
from gcc compiling.
If I added -ldl after gcc to resolve the issue, it said
"ld: fatal: library -ldl: not found"
because Sun didn't include a static version of `libdl.a' in /usr/lib.
Does anyone know where I can get the file libdl.a for Solaris?
or is there any workaround solution?
Thanks a lot in advance!
You should be able to add
-Xlinker -B -Xlinker dynamic -ldl -Xlinker -B -Xlinker static
around it get it to work. Its been awhile since I've done it. You might
have to play with the positioning of this in the link line.
Andy