C++ problems with sh4

Alexandra Kossovsky sasha at oktet.ru
Thu Nov 8 14:49:37 UTC 2001


On Thu, Nov 08, 2001 at 06:50:46AM -0600, Joel Sherrill wrote:
> Alexandra Kossovsky wrote:
> > 
> > On Mon, Nov 05, 2001 at 07:06:42AM -0600, Joel Sherrill wrote:
> > >
> > > Alexandra Kossovsky wrote:
> > > >
> > > > Hi!
> > > >
> > > > I have gensh4 bsp, and I need C++ to work.
> > > > It worked perfectly with ss-20010816
> > > >
> > > > Now, in ss-20011017 (or ss-20011025) it does not work.
> > > > The problem is with global constructors -- they are not called.
> > > >
> > > > gcc does not define __USE_INIT_FINI__ for sh4.
> > > > In 'gcc-2.95.3/gcc/config/sh/elf.h' there is:
> > > > ---------
> > > > /* Arrange to call __main, rather than using crtbegin.o and crtend.o
> > > >    and relying on .init and .fini being executed at appropriate times.  */
> > > > ---------
> > > >
> > > > In ss-20010816 gcc calls '__do_global_ctors' on the begining of 'main()',
> > > > and all is OK. In ss-20011025 where are no 'main()'.
> > > >
> > > > What can I do?
> > > > Should I patch gcc to do all this things through init & fini ?
> > > > Or something else?
> > >
> > > We did this because making main() available in user space is generally
> > > a good thing.
> > >
> > > Hmm... I see two possibilities.  As an experiment, change the name of
> > > the first task to main() and verify things work.
> > 
> > OK, it works.
> > 
> > > If that does in fact work, then we might want make the toolset
> > > define __USE__MAIN__ and have an alternative next to the
> > > __USE_INIT_FINI__.
> > > That presupposes that this won't result in the global ctors being
> > > called twice if someone uses main().
> > 
> > It would be fine. Can I help with this work?
> 
> I don't think there is much you can do except provide some
> information.  I will need to patch the file gcc/config/sh/rtems.h,
> generate a new gcc patch, and crank RPMs.  Some questions:
> 
>   + If we call __main like __init and there is a user main(),
>     is it safe to call __main twice?  

>From libgcc2.c :
----------------
void
SYMBOL__MAIN ()
{
  /* Support recursive calls to `main': run initializers just once.  */
  static int initialized;
  if (! initialized)
    {
      initialized = 1;
      __do_global_ctors ();
    }
}
----------------
So it seems to be safe to call __main twice.

>   + What about global destructors when using __main?  How do
>     they get invoked?

Destructors get invoked on 'atexit'. This 'atexit' is executed after 
call for global constructors.


>   + (less important) what other RTEMS tool configurations use 
>     __main?
> 
> -- 
> Joel Sherrill, Ph.D.             Director of Research & Development
> joel at OARcorp.com                 On-Line Applications Research
> Ask me about RTEMS: a free RTOS  Huntsville AL 35805
>    Support Available             (256) 722-9985

-- 

Alexandra Kossovsky
OKTET Ltd.
1 Ulianovskaya st., Petergof, St.Petersburg, 198904 Russia
Phones: +7(812)428-43-84(work) +7(812)184-52-58(home) +7(812)956-42-86(mobile)
e-mail: sasha at oktet.ru (or sasha at gate.ort.spb.ru)




More information about the users mailing list