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