C++ problems with sh4

Joel Sherrill joel.sherrill at OARcorp.com
Thu Nov 8 16:07:31 UTC 2001


Alexandra Kossovsky wrote:
> 
> 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.

Great.  Then this is just an alternative set of names to call with
the same semantics.

> >   + (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)

-- 
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



More information about the users mailing list