Takashi Yoshii wrote: > Hi, > > As a comment in libc/sysdeps/linux/sh/crt1.S says >> /* __uClibc_main (main, argc, argv, init, fini) */ > , something wrong here. There should be two more args. > > 7th arg "stack_end" seems to be missing. > 6th one is not listed, but the original code pushed register "r4" here. > It is not documented, but because ldso/ldso/sh/dl-startup.h explicitly sets > 0 to r4 just before jump here, there must be a kind of calling convention. > So, I preserve the code, and add a comment that this is the way to pass > rtld_fini from prior routine. > I really can't find any documents about this convention, though. > > /yoshii > > --- > sh: Fix args for __uClibc_main() in crt1.S > add missing 7th arg "stack_end". > add comment of undocumented usage of r4. > fix comment of expected __uClibc_main() prototype. > > diff --git a/libc/sysdeps/linux/sh/crt1.S b/libc/sysdeps/linux/sh/crt1.S > --- a/libc/sysdeps/linux/sh/crt1.S > +++ b/libc/sysdeps/linux/sh/crt1.S > @@ -24,6 +24,11 @@ > > At this entry point, most registers' values are unspecified, except: > > + r4 Contains a function pointer to be registered with > `atexit'. > + This is how the dynamic linker arranges to have DT_FINI > + functions called for shared libraries that have been loaded > + before this code runs. > + > sp The stack contains the arguments and environment: > 0(sp) argc > 4(sp) argv[0] > @@ -48,7 +53,8 @@ _start: > mov.l @r15+,r5 > mov r15, r6 > > - /* Push the fini func onto the stack */ > + /* Push the stack_end, rtld_fini and fini func onto the stack */ > + mov.l r6,@-r15 > mov.l r4,@-r15 > mov.l L_fini,r0 > mov.l r0,@-r15 > @@ -57,7 +63,7 @@ _start: > mov.l L_main,r4 > mov.l L_init,r7 > > - /* __uClibc_main (main, argc, argv, init, fini) */ > + /* __uClibc_main (main, argc, argv, init, fini, rtld_fini, stack_end) */ > > /* Let the libc call main and exit with its return code. */ > mov.l L_uClibc_main,r1 >
Hi Takashi, your point is correct and the patch looks fine. Looking again at the ld.so -> _start flow, yes sh4 forces rtld_fini to be NULL (r4 = 0 set in dl-startup.h as you told), so this means that on sh4 we do not call the _dl_fini destructor, loosing eventually to call the destructors of the dependant shared objects. It should be simple enough to write a test showing this. I'll spend a few time longer to look at what it's happening on glibc part, and eventually integrate your patch by setting the rtld_fini (6 ^ args) too. Thanks a lot, Carmelo > _______________________________________________ > uClibc mailing list > [email protected] > http://busybox.net/cgi-bin/mailman/listinfo/uclibc > _______________________________________________ uClibc mailing list [email protected] http://busybox.net/cgi-bin/mailman/listinfo/uclibc
