Ответ 1
Это зависит от того, какой вариант инструментальной цепочки вы используете. Оба варианта DWARF и SEH (которые начинаются с GCC 4.8.0) являются только однонаправленными. Вы можете убедиться в этом, проверив структуру каталогов своих дистрибутивов, т.е. Они содержат только библиотеки с 64- и 32-разрядной адресацией, но не оба. С другой стороны, простые старые дистрибутивы SJLJ действительно являются двойными целями, и для того, чтобы построить 32-битную цель, просто поставьте флаг -m32
. Если это не работает, просто создайте с помощью i686-w64-mingw32-g++
.
BONUS
Кстати, три соответствующие библиотеки динамической компоновки (DLL), реализующие каждую модель исключения GCC,
-
libgcc_s_dw2-1.dll
(DWARF); -
libgcc_s_seh-1.dll
(SEH); -
libgcc_s_sjlj-1.dll
(SJLJ).
Следовательно, чтобы выяснить, какая именно модель исключения предоставляет ваш текущий дистрибутив MinGW-w64, вы можете либо
- проверить каталог и файловую структуру установки MinGW-w64 в надежде найти одну из этих DLL (обычно в
bin
); или - создайте какой-нибудь реальный или тестовый код на С++, включающий обработку исключений, чтобы связать связь с одной из этих DLL, а затем увидеть, на какой из этих DLL зависит встроенная цель (например, можно увидеть с помощью Dependency Walker в Windows); или
- применяйте подход грубой силы и скомпилируйте некоторый тестовый код для сборки (вместо машинного кода) и найдите наличие таких ссылок, как
___gxx_personality_v*
(DWARF),___gxx_personality_seh*
(SEH),___gxx_personality_sj*
(SJLJ); см. Получение текущей модели исключения GCC.