Предупреждение ассемблера с предупреждением gcc при размещении данных в .text - PullRequest
2 голосов
/ 18 октября 2019

Когда я компилирую

__attribute__((section(".text"))) const int x = 42;
int main(){ return x; }

с помощью gcc (работает с tinycc и clang), я получаю

Warning: ignoring changed section attributes for .text.

В чем причина предупрежденияи как это можно устранить, сохраняя (всегда только для чтения) данные в .text?

Ответы [ 2 ]

3 голосов
/ 18 октября 2019

Очевидно:

__attribute__((section(".text#"))) const int x = 42;

Ссылка: https://gcc.gnu.org/ml/gcc-help/2010-09/msg00088.html, где ответчик объясняет:

__attribute__ ((section(".text"))) заставит gcc испускать ,"aw",@progbits после .text чтобы изменить атрибуты раздела. Если вы используете: __attribute__ ((section(".text#"))) (обратите внимание на дополнительные '#'), этот суффикс будет закомментирован в сборке, и предупреждение исчезнет

В этом случае рассматриваемая переменная не была const, поэтомуэто было особенно опрометчиво (как сказал другой ответчик ) на тот же вопрос. В вашем случае это const, поэтому доступ имеет "a", а не "aw" - однако, вероятно, все же опрометчиво.

2 голосов
/ 18 октября 2019

Очевидно, что gcc испускает директиву .section .text,"a",@progbits вместо .section .text. Я не вижу способа избежать этого. Однако скрипт компоновщика по умолчанию обычно объединяет все разделы с именем .text.*, поэтому вы можете сделать что-то вроде __attribute__((section(".text.consts"))), и в конечном двоичном файле он будет находиться в разделе .text.

@ Клиффорд нашел хакерский обходной путь , который включает в себя # после имени раздела, чтобы ассемблер считал оставшуюся часть строки комментарием.

...