| section

Previous | Specifying Attributes of Variables | Next

Syntax: section ("section-name")
Normally, the compiler places the objects it generates in sections like `.data` and `.bss`. Sometimes, however, you need additional sections, or you need certain particular variables to appear in special sections, for example to map to special hardware. The `section` attribute specifies that a variable (or function) lives in a particular section. The use of this attribute is limited in TIGCC, because its linker supports only a few types of sections, but this may be improved in the future. For example, this small hypothetical program uses several specific section names:

    struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
    struct duart b __attribute__ ((section ("DUART_B"))) = { 0 };
    char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };
    int init_data __attribute__ ((section ("INITDATA"))) = 0;

    main()
    {
      /* Initialize stack pointer */
      init_sp (stack + sizeof (stack));

      /* Initialize initialized data */
      memcpy (&init_data, &data, &edata - &data);

      /* Turn on the serial ports */
      init_duart (&a);
      init_duart (&b);
    }

Use the `section` attribute with an initialized definition of a global variable, as shown in the example. GCC issues a warning and otherwise ignores the `section` attribute in uninitialized variable declarations.
You may only use the `section` attribute with a fully initialized global definition because of the way linkers work. The linker requires each object be defined once, with the exception that uninitialized variables tentatively go in the `.bss` section and can be multiply "defined". You can force a variable to be initialized with the '-fno-common' flag or the `nocommon` attribute.
The `section` attribute can also be used for functions.