Вот очень простой тестовый пример:
int a __attribute__ ((section("section")));
int b __attribute__ ((section("section")));
int c __attribute__ ((section("section")));
Если я скомпилирую этот файл с помощью GCC 8, без оптимизации и дамп объектного файла, я получу переменные в том же порядке, что и в исходном файле:
$ gcc -c order.c
$ nm -n order.o
0000000000000000 D a
0000000000000004 D b
0000000000000008 D c
Однако, если я включу оптимизацию (любой уровень), переменные в памяти меняются местами:
$ gcc -O -c order.c
$ nm -n order.o
0000000000000000 D c
0000000000000004 D b
0000000000000008 D a
Так как мне нужно сохранить согласованные адреса различных переменных в определенном разделе памяти для разных версий программы, я решил поместить все эти переменные в один и тот же исходный файл. Это для встроенного проекта, и раздел памяти, который я использую, имеет резервное питание от батареи, поэтому его содержимое не теряется при выключении устройства. Однако мне также нужно, чтобы адреса «старых» объектов оставались постоянными, и я не хочу, чтобы они менялись, когда я добавляю некоторые «новые» объекты.
Поэтому мне интересно, могу ли я управлять этим конкретным поведением GCC с помощью любого флага компилятора (кроме отключения оптимизации [; ) и является ли это чем-то согласованным в разных версиях GCC? Например, могу ли я предположить, что в GCC 11, в 2022 году, порядок переменных в памяти все еще будет обратным порядку в исходном файле, или, может быть, когда-нибудь порядок будет другим, чем сегодня в GCC 8?
@Jean-MarcZimmer - это не переменные стека, и не все архитектуры имеют «нисходящий» стек.
1. Нельзя полагаться на то, как данный компилятор в данной версии с заданным уровнем оптимизации раскладывает переменные в памяти. 2. Если это не представляет особых проблем, вы можете рассмотреть возможность помещения этих переменных внутрь структуры и применить к ней атрибут раздела. Он сохранит порядок переменных и является переносимым (в отличие от 1).
Поскольку вы помещаете все объявления в один файл. Можете ли вы отключить оптимизацию для конкретного файла и включить оптимизацию только для других файлов?





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