Thanks
I'll check this out.
~d
On Thursday 03 April 2003 02:56, Peter Jansen wrote:
> Hi,
>
> > I want to remap start-up configuration.
> >
> > So, I'm thinking of breaking down in parts some start-up procedures and
> > adding c++ constructors/destructors. In order to do that I think I will
> > add some sections like '.init0' ... '.init3' and '.fini0' ... '.fini3'
> > put appropriate code there.
>
> I help do some of the work getting c++ going on the AVR with gcc. This
> is the way the AVR handle from what I remember, but I think we had
> another section to for a user hook at pre startup routine if required.
>
> The changes I remember are something like,
>
> adding to gcc/config/avr.c
>
> > /* Define the pseudo-ops used to switch to the .ctors and .dtors
> > sections. There are no shared libraries on this target, and these
> > sections are placed in the read-only program memory, so they are not
> > writable. */
> >
> > #undef CTORS_SECTION_ASM_OP
> > #define CTORS_SECTION_ASM_OP "\t.section .ctors,\"a\",@progbits"
> >
> > #undef DTORS_SECTION_ASM_OP
> > #define DTORS_SECTION_ASM_OP "\t.section .dtors,\"a\",@progbits"
> >
> > #define TARGET_ASM_CONSTRUCTOR avr_asm_out_ctor
> > /* If defined, a function that outputs assembler code to arrange to
> > call the function referenced by SYMBOL at initialization time. */
> >
> > #define TARGET_ASM_DESTRUCTOR avr_asm_out_dtor
> > /* This is like `TARGET_ASM_CONSTRUCTOR' but used for termination
> > functions rather than initialization functions. */
>
> and adding to gcc/config/avr.c
>
> > static void avr_asm_out_ctor PARAMS ((rtx, int));
> > static void avr_asm_out_dtor PARAMS ((rtx, int));
>
> and
>
> > static void
> > avr_asm_out_ctor (symbol, priority)
> > rtx symbol;
> > int priority;
> > {
> > fputs ("\t.global __do_global_ctors\n", asm_out_file);
> > default_ctor_section_asm_out_constructor (symbol, priority);
> > }
> >
> > static void
> > avr_asm_out_dtor (symbol, priority)
> > rtx symbol;
> > int priority;
> > {
> > fputs ("\t.global __do_global_dtors\n", asm_out_file);
> > default_dtor_section_asm_out_destructor (symbol, priority);
> > }
>
> the line .global __do_global_dtors forces the linker to link in the
> dtors code when compiling c++ code.
>
> Then you need to add the ctors and dtors functions to libgcc.S
>
> The AVR port ended up with 9 .init and .fini sections a few for spares
> in case someone wanted to add code between the sections. There was no
> code penalty is there is no code in the section its not linked.
>
> Here is the extract from the avr linker script in binutils in binutils
> 2.13.2 ld/scripttempl/avr.sc
>
> > /* Internal text space or external memory */
> > .text :
> > {
> > *(.vectors)
> >
> > ${CONSTRUCTING+ __ctors_start = . ; }
> > ${CONSTRUCTING+ *(.ctors) }
> > ${CONSTRUCTING+ __ctors_end = . ; }
> > ${CONSTRUCTING+ __dtors_start = . ; }
> > ${CONSTRUCTING+ *(.dtors) }
> > ${CONSTRUCTING+ __dtors_end = . ; }
> >
> > *(.progmem.gcc*)
> > *(.progmem*)
> > ${RELOCATING+. = ALIGN(2);}
> > *(.init0) /* Start here after reset. */
> > *(.init1)
> > *(.init2) /* Clear __zero_reg__, set up stack pointer. */
> > *(.init3)
> > *(.init4) /* Initialize data and BSS. */
> > *(.init5)
> > *(.init6) /* C++ constructors. */
> > *(.init7)
> > *(.init8)
> > *(.init9) /* Call main(). */
> > *(.text)
> > ${RELOCATING+. = ALIGN(2);}
> > *(.text.*)
> > ${RELOCATING+. = ALIGN(2);}
> > *(.fini9) /* _exit() starts here. */
> > *(.fini8)
> > *(.fini7)
> > *(.fini6) /* C++ destructors. */
> > *(.fini5)
> > *(.fini4)
> > *(.fini3)
> > *(.fini2)
> > *(.fini1)
> > *(.fini0) /* Infinite loop after program termination. */
> > ${RELOCATING+ _etext = . ; }
> > } ${RELOCATING+ > text}
>
> Then avr-libc was changed to put the bits of code into the correct
> sections, have a look at
>
> http://savannah.nongnu.org/cgi-bin/viewcvs/avr-libc/avr-libc/crt1/gcrt1.S?r
>ev=1.3&content-type=text/vnd.viewcvs-markup
>
> All these section were put into one file to make them easy to find,
> although you have some C code to do the bss zero and data copy.
>
> although this code is not GPL so maybe and the msp430 startup code is
> different, so maybe to and to reimplement the same strategy. Although
> Marek may allow you to copy it and put it under GPL.
>
> > In details:
> > - .init0 will contain copy data section loop
> > - .init1 will contain clear bss loop
> > - .init2 will contain c++ constructors code and linked as appropriate
> > - .init3 jump to main only: 'br #main'
> >
> > - .fini0 will contain _nothing_ .. just a label __stop_ProcExec_
> > - .fini1 will contail c++ destructors linked as necessary
> > - .fini2 will contain an old __stop_ProcExec_ and new label to loop at
> > like .Llabel:
> > mov r15, r2
> > jmp .Llabel
> >
> > - .fini3 will contain ... something.
> >
> > Also, two sections have to be introduced - .ctors and .dtors
> >
> > The overal elf sections map will look as:
> > .text:
> > .init0
> > .init1
> > .init2
> > .init3
> >
> > ... user code as in .text.*
> >
> > .fini0
> > .fini1
> > .fini2
> > .fini3
> >
> > .ctors
> > .dtors
> >
> > .data
> >
> > .noinit's data (still in doubt if .noinit may contain initialized data)
> >
> > .vectors:
> >
> > .bss:
> > .bss
> > .noinit
> > .all the user stuff
> >
> >
> > Any suggestions? Comments? Additions? etc.?
> >
> > I hope to implement it in gcc-3.3 (hopefully) and above and current
> > binutils.
>
> We found the code generated by g++ constructors, destructors was quite
> large, I think you end up with three constructor/destructor functions
> for every one, I don't know if they have fixed this in gcc yet.
>
> Compiling your code with -fno-rtti -fno-enforce-eh-specs -fno-exceptions
> the define was added to gcc gcc/config/avr/avr.h
>
> > /* A C string constant that tells the GNU CC driver program options to
> > pass to `cc1'. It can also specify how to translate options you
> > give to GNU CC into options for GNU CC to pass to the `cc1'.
> >
> > Do not define this macro if it does not need to do anything. */
> >
> > #define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
> > %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
> > %{!fexceptions:-fno-exceptions}"
>
> Do you have this under control or want me do do some of the above work
> and send you the patches?
>
> Regards,
--
/********************************************************************
("`-''-/").___..--''"`-._ (\ Dimmy the Wild UA1ACZ
`6_ 6 ) `-. ( ).`-.__.`) Enterprise Information Sys
(_Y_.)' ._ ) `._ `. ``-..-' Nevsky prospekt, 20 / 44
_..`--'_..-_/ /--'_.' ,' Saint Petersburg, Russia
(il),-'' (li),' ((!.-' +7 (812) 3468202, 5585314
********************************************************************/