Kevin Brosius on Mon, 24 Feb 2003 13:41:03 -0500


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] Testing a new glibc


mjd-lists-plug@plover.com wrote:
> 
> gabriel rosenkoetter:
> > On Tue, Feb 18, 2003 at 09:36:59PM -0500, mjd-lists-plug@plover.com wrote:
> > > I recently built glibc-3.2 and installed it under /usr/local/glibc-3.2
> > > instead of in the default place.  Now I want to try it out.  How can
> > > I tell gcc to use the new libraries and include files instead of the
> > > old ones?  Do I need to wrte a new specfile?
> >
> > Setting LDFLAGS=-Wl,--rpath -Wl, and
> > CPPFLAGS=-I ought to do it.
> 
> It seems not.  Something else seems to be wrong.
> 
> I think the problem might be that gcc is using the wrong dynamic
> linker.  Here are some outputs:
> 
>         plover% gcc -v -Wl,--rpath,/usr/local/glibc-3.2/lib -I/usr/local/glibc-3.2/include -o hello hello.c
>         Reading specs from /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/specs
>         Configured with: /src/gcc-3.2/configure --enable-threads --enable-languages=c,c++,java,objc
>         Thread model: posix
>         gcc version 3.2
>          /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/cc1 -lang-c -v -I/usr/local/glibc-3.2/include -D__GNUC__=3 -D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -D__ELF__ -Dunix -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1 -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i586__ -D__tune_pentium__ hello.c -quiet -dumpbase hello.c -version -o /tmp/ccuYdlYi.s
>         ignoring nonexistent directory "/usr/local/glibc-3.2/include"
>         GNU CPP version 3.2 (cpplib) (i386 Linux/ELF)
>         GNU C version 3.2 (i586-pc-linux-gnu)
>                 compiled by GNU C version 3.2.
>         ignoring nonexistent directory "NONE/include"
>         ignoring nonexistent directory "/usr/local/i586-pc-linux-gnu/include"
>         #include "..." search starts here:
>         #include <...> search starts here:
>          /usr/local/include
>          /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/include
>          /usr/include
>         End of search list.
>          as --traditional-format -V -Qy -o /tmp/ccas9xdM.o /tmp/ccuYdlYi.s
>         GNU assembler version 2.13.90.0.2 (i386-redhat-linux) using BFD version 2.13.90.0.2 20020802
>          /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../../crt1.o /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../../crti.o /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/crtbegin.o -L/usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2 -L/usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../.. --rpath /usr/local/glibc-3.2/lib /tmp/ccas9xdM.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/crtend.o /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../../crtn.o
> 
> Now I run ./hello:
> 
>         plover% ./hello
>         ./hello: /lib/libc.so.6: version `GCC_3.0' not found (required by ./hello)
> 
> Now I'll tell it to use the new library:
> 
>         plover% LD_LIBRARY_PATH=/usr/local/glibc-2.3/lib ./hello
>         ./hello: /lib/ld-linux.so.2: version `GLIBC_PRIVATE' not found (required by /usr/local/glibc-2.3/lib/libc.so.6)
> 
> OK, I'll tell it to use the new dynamic linker also:
> 
>         plover% LD_LIBRARY_PATH=/usr/local/glibc-2.3/lib /usr/local/glibc-2.3/lib/ld-linux.so.2  ./hello
>         Hello, world.
> 
> Aha.
> 
> Now, I will rerun gcc manually.
> 
>         plover% gcc -c hello.c
> 
> This next command is copied from the output of 'gcc -v' above, except
> that I have changed the value of the '-dynamic-linker' option from
> /lib/ld-linux.so.2 to /usr/local/glibc-2.3/lib/ld-linux.so.2:
> 
>        plover%  /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/collect2 -m elf_i386 -dynamic-linker /usr/local/glibc-2.3/lib/ld-linux.so.2 -o hello /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../../crt1.o /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../../crti.o /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/crtbegin.o -L/usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2 -L/usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../.. hello.o -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/crtend.o /usr/local/lib/gcc-lib/i586-pc-linux-gnu/3.2/../../../crtn.o
> 
> Now this works:
> 
>         plover% LD_LIBRARY_PATH=/usr/local/glibc-2.3/lib  ./hello
>         Hello, world.
> 
> So I'll try the short version:
> 
>         plover% gcc -o hello -Wl,-dynamic-linker,/usr/local/glibc-2.3/lib/ld-linux.so.2  hello.c
>         plover% LD_LIBRARY_PATH=/usr/local/glibc-2.3/lib  ./hello
>         Hello, world.
> 
> So now I'll try adding the --rpath option so that I don't have to
> force LD_LIBRARY_PATH when I'm running the command:
> 
>         plover% gcc -o hello -Wl,-dynamic-linker,/usr/local/glibc-2.3/lib/ld-linux.so.2  -Wl,--rpath,/usr/local/glibc-2.3/lib/ hello.c
> 
>         /usr/local/lib/libc.so.6: undefined reference to `_dl_lazy@GLIBC_2.1.1'
>         /usr/local/lib/libc.so.6: undefined reference to `_dl_dst_substitute@GLIBC_2.1.1'
>         /usr/local/lib/libc.so.6: undefined reference to `_dl_out_of_memory@GLIBC_2.2'
>         /usr/local/lib/libc.so.6: undefined reference to `_dl_relocate_object@GLIBC_2.0'
>         ...
>         /usr/local/lib/libc.so.6: undefined reference to `_dl_global_scope_alloc@GLIBC_2.1'
>         collect2: ld returned 1 exit status
> 
> What's happening here?
> 
> I get the same results if I run collect2 manually with the indicated
> arguments.
> 
> Any suggestions?
> 
> Is there an "understand everything about dynamic libraries" document somewhere?

The glibc install doc used to have a fairly good description of how to
set up multiple test environments, but it isn't pretty.  You don't need
the LD_PRELOAD stuff however, as the dynamic linker has had the ability
to load libraries based on major version since around libc 2 .x

gcc is a little harder however, and I'd suggest that writing another
specfile is the best way to go.  That allows you to specify which setup
gcc should use, and includes all the toolchain changes if you need
them.  The libc install doc used to explain how to do that also.

What version of libc is on the system already?  I see some references to
2.0, 2.1 above, and as I mentioned above, if you're just using a 2.1
version vs. a 3.2 version, the dynamic loader can take care of that side
for you (you just add both libc paths to the loader config and make sure
they are installed in different directories, as you already did.)

Hmm, why is your 'new' linker in glibc-2.3?  Didn't you say you are
installing glibc 3.2?

-- 
Kevin Brosius
_________________________________________________________________________
Philadelphia Linux Users Group        --       http://www.phillylinux.org
Announcements - http://lists.netisland.net/mailman/listinfo/plug-announce
General Discussion  --   http://lists.netisland.net/mailman/listinfo/plug