This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: What is needed to support uclinux shared libraries on MMU-lessARM?
- From: Bernardo Innocenti <bernie at develer dot com>
- To: John Lee <chunqiang77 at 163 dot com>
- Cc: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Mon, 14 Jun 2004 20:33:57 +0200
- Subject: Re: What is needed to support uclinux shared libraries on MMU-lessARM?
- Organization: Develer S.r.l.
John Lee wrote:
Bernardo Innocenti wrote:
If you meant that nobody knows about it, well all the
people who made the current ARM and m68k toolchains
for uClinux are active posters in uclinux-dev and
they helped me a lot with my m68k work.
I am sorry for my poor English. I mean that nobody
reply to my question in uClinux-dev mail list.
:-) English is not my native language too,
otherwise I would probably have understood you
the first time.
1. In function main() of the application, what is the
first value of a5? Who load the initialization of a5?
Look for get_pic_a5() in linux-2.4.x/arch/m68knommu/platform/5307/signal.c.
For 2.6, I dunno where they've hidden it ;-)
According to the source code in linux-2.4.x/arch/m68knommu/platform/5307/signal.c
and in linux-2.4.x/arch/m68knommu/platform/5307/entry.S, Before the program return
from system call, get_pic_a5() will be called to get the value of a5. Is it right?
Yes. And I believe (but I'm not sure) that this is how A5 gets
its initial value when the task execution starts.
Signal handlers also require A5 initialization because they
could be called from anywhere, even from places where A5 is
being used for other purposes.
For libraries, there's also an additional trick in the
startup code:
/* We've got to provide an entry point that doesn't stuff around with a5 like
* C routines tend to do. We must also setup a5 from d5 which won't point to
* this libraries data segment but from which it can be obtained.
*/
asm( ".globl lib_main\n\t"
".type lib_main,@function\n"
"lib_main:\n\t"
"move.l d5, a5\n\t"
"bra.w main\n"
".L__end_lib_main__:\n\t"
".size lib_main,.L__end_lib_main__-libmain"
);
This is in uclinux/lib/libc/main.c, but uClibc also links
this file when it's built as a shared library (see uClibc's
top-level Makefile).
Who calls function lib_main()? If nobody calls it, these code
will not work in any case.
That's a good question, but I don't know the answer.
binfmt_flat.c does some special things for libraries, but
there's nothing about lib_main or passing something in D5.
I've grepped the kernel looking for the place where D5 is
initialized, but I couldn't find it.
There's no ld.so in uClinux (at least, not for uClibc),
so I'm completely lost :-)
Paul Dale probably know the answer...
--
// Bernardo Innocenti - Develer S.r.l., R&D dept.
\X/ http://www.develer.com/