Как избавиться от предупреждения ассемблера gcc "установка неверных атрибутов раздела для .init" в коде C? - PullRequest
1 голос
/ 14 апреля 2009

У меня есть следующий код C:

struct myStruct_t
{
    const char     m_name[60];
    const uint32_t m_data;
};

const struct myStruct_t myStruct
    __attribute__(( __aligned__( 64 ), section(".init") )) =
    {
        "myName",
        (uint32_t)&someOtherStruct
    };

Когда я компилирую в gcc 4.1.1 (для PS3), я получаю предупреждение:

1>c:/t/ccy6.s: Assembler messages:
1>c:/t/ccy6.s(106): Warning: setting incorrect section attributes for .init

Код сборки, на который указывает предупреждение, - это раздел ".section" ниже:

            .section              .init,"aw",@progbits
            .align 6
            .type                 myStruct , @object
            .size                 myStruct , 64
myStruct :
            .ascii                "myName"
            .long                 someOtherStruct

Ему не нравится "w" (доступная для записи) часть флагов, поскольку вещи в .init доступны только для чтения, а "const" во всех возможных местах не заставляет компилятор не выплевывать ш». Как я могу сказать компилятору "нет, правда, это const, я не шучу"?

Ответы [ 5 ]

3 голосов
/ 11 августа 2010

Это проблема с GCC, автоматически задающим параметры для директивы .section. К счастью, параметр имени раздела копируется непосредственно в вывод сборки, что позволяет обойти эту проблему.

Эта директива:

__attribute__ ((section(".init")))

Создает эту сборку:

.section .init,"aw",@progbits

Чтобы удалить предупреждение, вы можете указать атрибут следующим образом:

__attribute__ ((section(".init,\"ar\",@progbits ;")))

Который сгенерирует:

.section .init,"ar",@progbits ;"aw",@progbits

Точка с запятой отмечает остаток строки как комментарий, поэтому ассемблер игнорирует его.

0 голосов
/ 24 апреля 2009

Если вы хотите разместить myStruct где-то особенным, используйте файл компоновщика.

http://sourceware.org/binutils/docs-2.19/ld/Scripts.html#Scripts

0 голосов
/ 14 апреля 2009

На ПК с GNU / Linux с GCC 4.3.3 .init не доступен для записи. Я не нашел в документации, как установить атрибуты раздела вручную.

Возможно, это не сильно поможет, но вот несколько советов:

  • Если вы хотите выполнить некоторый код до main(), вы можете использовать объект C ++. Его конструктор будет вызываться до main(), а деструктор - после.
  • Вы можете написать небольшой инструмент, который будет исправлять объектный файл вручную. Я уверен, что это уже существует. Может быть здесь: http://www.eresi -project.org / .
  • Вы можете связаться с разработчиками GCC. Может быть, это ошибка.
0 голосов
/ 18 апреля 2009

Ради Бога, человек, не пытайтесь использовать gcc в качестве ассемблера! Я не вижу никакой причины, почему эта вещь должна быть в разделе .init (это не код), но если она у вас должна быть, напишите требуемый код сборки (у вас хорошее начало, просто отредактируйте ), поместите его под контроль исходного кода в соответствующем месте для каждой платформы и покончите с этим!

0 голосов
/ 14 апреля 2009

Неверное предположение, но, возможно, неправильный атрибут - это "w", который предлагает мне "доступный для записи". Это все еще делает это, если все в вашей структуре является константой?

Редактировать: Случайный поиск в Google, кажется, предполагает, что "w" также может означать "слабый"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...