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