Gcc: аналогичная опция в качестве параметра mstructure-size-для 32-разрядной версии x86

#c #linux #gcc #x86 #arm

#c #linux #gcc #x86 #arm

Вопрос:

Я переношу некоторый сгенерированный код из Keil в Linux. Этот код C автоматически генерируется инструментом ПЛК с графическим интерфейсом и не подлежит изменению (это логика управления, которая создается конечным пользователем для его варианта использования) Это работало только на оборудовании ARM с ОС Keil. Теперь мы хотим запустить это программное обеспечение на ARM и 32-разрядной версии x86

Для ARM у нас есть возможность -mstructure-size-option=32 создавать структуры размером не менее 4 байт. Эта опция недоступна для x86, и код не запускается без этой опции из-за, например

 struct myStruct { char i; }
  
  • В ARM Linux sizeof(myStruct) = 4 байта с -mstructure-size-option=32

  • В x86 32-разрядном Linux sizeof(myStruct) = 1 байт

Есть ли у gcc возможность сделать размеры структуры кратными 4 байтам на x86? Я не говорю о заполнении или выравнивании внутри структуры…

Комментарии:

1. но зачем вам это нужно? Что не так с char _padding___[3] там

2. Прочитав документацию, я бы сказал нет , поскольку, если бы она была , она, вероятно, называлась бы так -mstructure-size-boundary , но она не работает на x86-32, 64 или любой другой версии GCC.

3. Это «минимальный размер равен 4» или «размер должен быть кратен 4 байтам»? Можете ли вы использовать элемент union с int32_t , чтобы принудительно увеличить размер, кратный 4? Вероятно, в вопросе должна быть информация о «коде C, сгенерированном инструментом графического интерфейса PLC». Однако это не сделает жизнь проще.

4. Хорошей новостью является то, что если структура содержит int (или больше) тип float or double , ее размер будет кратен 4, если только вы не настолько извращены, чтобы использовать пакетные прагмы. Таким образом, только структуры, которые содержат только char или short поля / массивы, не будут автоматически иметь размер, кратный 4 байтам. Для этих структур вам, вероятно, придется добавить дополнение вручную. Я все еще нахожу удивительным, что код не работает, если размеры структуры не кратны 4 байтам; это никогда не было проблемой для меня за мои более чем 30 лет программирования на C .

5. @JonathanLeffler: вместо явного заполнения есть опция struct foo{ _Alignas(4) char i; }; , заставляющая компилятор создавать неявное заполнение, чтобы размер был кратен выравниванию. godbolt.org/z/vgwofb . Но вы должны применить это к члену, а не к внешней стороне самой структуры. О, но gcc действительно позволяет struct __attribute__((aligned(4))) small{ char i; }; с желаемым эффектом. (Хотя и не совсем идентично 4-байтовой структуре с alignas(1) , если она встроена в другую структуру.)