beldmit: (Программизм)
[personal profile] beldmit
Попробовал собрать наш продукт clang-ом под 32-битный arm. Получил несудьбу.

clang предлагает довольно агрессивную реализацию memset/memcpy и родственников, которая требует выравнивания памяти по 16 байтам минимум, иначе прилетает SIGBUS.
Доверчивый clang поверил, что структура выравнивается по 16 байтам. После того, как я перестал его обманывать, он подставил правильную версию memset.

Память, которую он должен зачищать, прилетает извне. При этом полученный блок оказывается выровнен по 8 байтам. То есть в половине случаев это окажется по 16 и всё сработает, а в половине - по 8, и получим SIGBUS.

Гранулировать выравнивание адресов из malloc-а вообще говоря нельзя. Точнее, есть несколько функций, в работоспособности которых я сомневаюсь, и тип max_align_t, который определяется как

// Define 'max_align_t' to match the GCC definition.
typedef struct {
  long long __clang_max_align_nonce1
      __attribute__((__aligned__(__alignof__(long long))));
  long double __clang_max_align_nonce2
      __attribute__((__aligned__(__alignof__(long double))));
} max_align_t;


а в GCC это __BIGGEST_ALIGNMENT__

То «извне», из которого прилетает это самое __BIGGEST_ALIGNMENT__, я могу и пересобрать. Но вообще печально я гляжу.

Date: 2019-03-01 02:50 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Вот этот патч clang_arm.patch заставляет задуматься о том какая возможна форма у ручки.

Profile

beldmit: (Default)
Dmitry Belyavskiy

December 2025

S M T W T F S
 123456
78910111213
14151617181920
2122 2324252627
28293031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 11:14 pm
Powered by Dreamwidth Studios