This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Jakub Jelinek <jakub@redhat.com> writes: > On Mon, Mar 05, 2001 at 09:51:37PM +0100, Andreas Jaeger wrote: > > Andreas Jaeger <aj@suse.de> writes: > > > > > Ulrich Drepper <drepper@redhat.com> writes: > > > > > > > Second, I haven't gotten any comments on the atexit() implementation > > > > changes I made. They are so non-obvious that I thought the one or > > > > other would comment. The good thing is that this implementation > > > > should be very robust. The bad thing is that old programs cannot be > > > > fixed, everything (means DSOs) has to be relinked (if they have this > > > > problem which is fortunately rare). I don't think this is a problem. > > > > Note that today (until sometime next week :-) this atexit() > > > > implementation is not Unix conforming. Unix currently forbids this > > > > behavior (this means the registered functions are called at dlclose() > > > > time). I've filed an defect report which will be handled next week. > > > > > > make check fails now for me: > > > > > > GCONV_PATH=/builds/glibc/main-gcc-2.95/iconvdata LC_ALL=C /builds/glibc/main-gcc-2.95/elf/ld-linux.so.2 --library-path /builds/glibc/main-gcc-2.95:/builds/glibc/main-gcc-2.95/math:/builds/glibc/main-gcc-2.95/elf:/builds/glibc/main-gcc-2.95/dlfcn:/builds/glibc/main-gcc-2.95/nss:/builds/glibc/main-gcc-2.95/nis:/builds/glibc/main-gcc-2.95/rt:/builds/glibc/main-gcc-2.95/resolv:/builds/glibc/main-gcc-2.95/crypt:/builds/glibc/main-gcc-2.95/linuxthreads /builds/glibc/main-gcc-2.95/dlfcn/tstcxaatexit > /builds/glibc/main-gcc-2.95/dlfcn/tstcxaatexit.out > > > make[2]: *** [/builds/glibc/main-gcc-2.95/dlfcn/tstcxaatexit.out] Error 1 > > > > > > gromit:/builds/glibc/main-gcc-2.95:[0]$ cat dlfcn/tstcxaatexit.out > > > cannot open "modcxaatexit.so": /builds/glibc/main-gcc-2.95/dlfcn/modcxaatexit.so: undefined symbol: __dso_handle > > This one can be compiled with something like: > > --- libc/dlfcn/modcxaatexit.c.jj Mon Feb 26 18:41:22 2001 > +++ libc/dlfcn/modcxaatexit.c Tue Mar 6 16:34:53 2001 > @@ -33,7 +33,7 @@ fluffy (void *p) > void > bar (void *p) > { > - extern void *__dso_handle; > + extern void *__dso_handle __attribute__ ((__weak__)); > printf ("This is %s\n", __FUNCTION__); > - __cxa_atexit (fluffy, p, __dso_handle); > + __cxa_atexit (fluffy, p, &__dso_handle ? __dso_handle : NULL); > } > > (but the test will fail anyway). > > > > > > This is with gcc 2.95.2. With a 3.0 pre release I get a segmentation > > > fault, I'll send details tomorrow. > > > > It's not tomorrow ;-) but here's the failure: > > > > gromit:/usr/src/cvs/libc/dlfcn:[0]$ GCONV_PATH=/builds/glibc/20010106-gcc-2.97.test/iconvdata LC_ALL=C /builds/glibc/20010106-gcc-2.97.test/elf/ld-linux.so.2 --library-path /builds/glibc/20010106-gcc-2.97.test:/builds/glibc/20010106-gcc-2.97.test/math:/builds/glibc/20010106-gcc-2.97.test/elf:/builds/glibc/20010106-gcc-2.97.test/dlfcn:/builds/glibc/20010106-gcc-2.97.test/nss:/builds/glibc/20010106-gcc-2.97.test/nis:/builds/glibc/20010106-gcc-2.97.test/rt:/builds/glibc/20010106-gcc-2.97.test/resolv:/builds/glibc/20010106-gcc-2.97.test/crypt:/builds/glibc/20010106-gcc-2.97.test/linuxthreads /builds/glibc/20010106-gcc-2.97.test/dlfcn/tstcxaatexit > > This is bar > > module unload didn't change `v' > > Segmentation fault > > But this one is IMHO more problematic. Initially I thought it is just that > libc_nonshared.a is not being dragged into DSOs built during glibc make, so > I have hacked up Makerules so that it drags in libc_nonshared.a and libc.so > if libc.so was requested (and did this outside of -Wl,--(no-)whole-archive > pair), but that did not fix things up, since gcc's crtstuff has this in: > > /* This is a kludge. The i386 GNU/Linux dynamic linker needs ___brk_addr, > __environ and atexit (). We have to make sure they are in the .dynsym > section. We accomplish it by making a dummy call here. This > code is never reached. */ > > #if defined(__linux__) && defined(__PIC__) && defined(__i386__) > { > extern void *___brk_addr; > extern char **__environ; > > ___brk_addr = __environ; > atexit (0); > } > #endif > > and so atexit ends up unversioned and undefined. > Perhaps we could change the order in libc.so linker script to > libc_nonshared.a libc.so and change atexit in glibc back to normal symbol > again, so that it catches up crtendS.o which comes last (well, before crtn.o > but there is just one for both shared and non-shared). I've updated my binutils, rebuild glibc and now it works - I'll retry on the other machine where I noticed this problem later today. Andreas -- Andreas Jaeger SuSE Labs aj@suse.de private aj@arthur.inka.de http://www.suse.de/~aj
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |