#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
ordouble
, ее размер будет кратен 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)
, если она встроена в другую структуру.)