[PATCH] sh: Fix args for __uClibc_main() in crt1.S

Carmelo AMOROSO carmelo.amoroso at st.com
Wed Aug 6 12:42:46 UTC 2008


Carmelo AMOROSO wrote:
> 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, at -r15
>>  	mov.l r4, at -r15
>>  	mov.l L_fini,r0
>>  	mov.l r0, at -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.

Well, I've written the test and, as I thought, we do not call the 
destructor for any dependant shared objects.

> 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.
> 
Indeed glibc (sysdeps/sh/dl-machine.h: _start) passes in r4 the _dl_fini
instead of NULL. This makes dso's destructor get properly called.

I'll see how to integrate a test case into the test-suite too.

Full fix will come soon.
Carmelo

> Thanks a lot,
> Carmelo
>> _______________________________________________
>> uClibc mailing list
>> uClibc at uclibc.org
>> http://busybox.net/cgi-bin/mailman/listinfo/uclibc
>>
> 
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://busybox.net/cgi-bin/mailman/listinfo/uclibc
> 




More information about the uClibc mailing list