Для этих целей используется модификатор __attribute__ который может задавать условия сохранения структур, данных и т.п. в исполняемом файле. Модификатору __attribute__ передается в параметр сам атрибут, в нашем случае атрибут называется section, который принимает в параметр имя секции (сегмента). Имена сегментов принято писать с ведущей точки, например .data, .text и т.п., но далеко не все этого правила придерживаются. Сейчас я попробую привести в качестве примера строку, которая будет расположена в сегменте «.testseg» после линковки программы:
const char testarray[] __attribute__((section(«.testseg»))) = «This is a test string !»;
В этом примере хорошо видно, что это простое объявление открытого массива testchar, состоящего из элементов типа char. Точно таким же образом мы можем указать для всех нам необходимых данных, что они будут находиться в том сегменте, который мы хотим.
С атрибутом section разобрались, теперь рассмотрим еще несколько атрибутов, которые нам пригодятся в дальнейшем. Это атрибуты packed и aligned. Первый используется при необходимости объявить структуру без выравниваний мелких типов (char, short) на 4 байта (в QNX 6.2 уже по умолчанию стоит 8 байт выравнивания для некоторых системных вещей и для внутренних структур, используемых в Photon). Многие используют этот атрибут в виде записи #pragma pack(1) — для паковки структур. Эту запись использовать, на мой взгляд, будет правильнее, но мы уже используем атрибуты в программе, поэтому запись через #pragma будет особенно бросаться в глаза и для паковки структур мы будем тоже использовать атрибут.
struct str
{
char a;
char b;
} __attribute__ (( packed ));
Второй атрибут — aligned — используется для выравнивания данных на определенную границу, к примеру все процессоры Intel x86, начиная с первых MMX обращаясь к данным, которые выравнены на границу 32 байта имели превосходство по скорости доступа по сравнению с обращением к невыравненным данным. Этот атрибут будет также нам полезен далее.
struct str test __attribute__((aligned(16))) = {.a=5, .b=6};