Принуждение 64-битных удваивается?

Я создаю musl-libc статически для проекта на платформе aarch64 (ARM 64-bit). Я бы хотел избегать любых мягких библиотек с плавающей запятой, таких как GCC soft float library подпрограммы. Однако они все еще появляются в библиотечных архивах, даже когда я использую -mfloat-abi=hard. Насколько я могу судить, это потому, что 64-битные платформы ARM определяют long double как 128 бит.

Есть ли способ изменить это поведение? Например, можно ли форсировать long double как тот же размер, что и double? Я знаю, что это разрешено стандартом C, но я не уверен, есть ли способ заставить Clang (я специально использую Clang для этого) для компиляции с таким определением.

Ответ 1

Мне приходилось делать что-то подобное раньше, пушистая с типами (особенно long s). Лучше всего просто вручную заменить типы вручную, поскольку это самый простой и самый простой способ получить то, что вы хотите. Вы можете попробовать сыграть трюки с помощью макросов или массировать компилятор, но из моего опыта вы просто создаете больше проблем, чем решаете, и обычно это хрупкое решение, которое ломается позже.

К счастью, источники, с которыми вы работаете, выглядят в хорошем состоянии, а изменения, которые вы ищете, довольно полные. Вы можете просто пробить это. Предполагая, что вы используете Unix-подобную систему, вы можете запустить следующую команду из базового каталога musl:

$ grep -Rl 'long double' * | xargs -tn1 sed -i '' -e 's/long double/double/g'

Эта команда:

  • Ищет строку long double во всех файлах, рекурсивно и возвращает имена файлов, которые содержат эту строку.
  • который передается в xargs, который вызывает команду sed для каждого имени файла, печатается по мере ее прохождения.
  • Когда sed запускается, он изменяет файл на месте и заменяет long double на double.

Когда я попробовал эту команду, она "просто сработала". Я хотел бы внимательно изучить diff, чтобы убедиться, что он полностью ударил и не изменил поведение библиотеки.