Jak skompilować i połączyć 32-bitowy plik wykonywalny systemu Windows za pomocą mingw-w64
Używam Ubuntu 13.04 i zainstalowałem mingw-w64 używając apt-get install mingw-w64
. Mogę skompilować i połączyć działającą 64-bitową wersję mojego programu za pomocą następującego polecenia:
x86_64-w64-mingw32-g++ code.cpp -o app.exe
, który generuje 64-bitową aplikację .plik exe.
Jakich FLAG binarnych lub Wiersza poleceń używam do generowania 32-bitowej wersji aplikacji.exe?
1 answers
To zależy od tego, którego wariantu toolchaina aktualnie używasz. Oba warianty DWARF i SEH (które pochodzą z GCC 4.8.0) są tylko pojedynczymi celami. Możesz to zobaczyć samemu, sprawdzając strukturę katalogów ich dystrybucji, tzn. zawierają one tylko biblioteki z adresacją 64 - i 32-bitową, ale nie obie. Z drugiej strony, zwykłe stare dystrybucje sjlj są rzeczywiście dual-target, a aby zbudować 32-bitowy cel, wystarczy dostarczyć -m32
flaga. Jeśli to nie zadziała, po prostu zbuduj z i686-w64-mingw32-g++
.
BONUS
Przy okazji, trzy odpowiadające biblioteki dynamicznego łącza (DLL) implementujące każdy Model wyjątku GCC to
-
libgcc_s_dw2-1.dll
(DWARF); -
libgcc_s_seh-1.dll
(SEH); -
libgcc_s_sjlj-1.dll
(SJLJ).
Stąd, aby dowiedzieć się, jaki model WYJĄTKÓW zapewnia twoja obecna Dystrybucja MinGW-w64, możesz albo
- sprawdź katalog i plik konstrukcja instalacji MinGW-w64 w nadziei na zlokalizowanie jednego z tych bibliotek DLL (zazwyczaj w
bin
); lub - zbuduj prawdziwy lub przetestuj kod C++ obejmujący obsługę wyjątków, aby wymusić połączenie z jedną z tych bibliotek DLL, a następnie sprawdź, które z nich zależy od zbudowanego celu (na przykład, można zobaczyć za pomocą Dependency Walker w systemie Windows); lub
- weź podejście brute force i skompiluj jakiś kod testowy do assembly (zamiast kodu maszynowego) i poszukaj obecności referencji podobnie jak
___gxx_personality_v*
(DWARF),___gxx_personality_seh*
(SEH),___gxx_personality_sj*
(SJLJ); zobacz uzyskanie bieżącego modelu WYJĄTKÓW GCC.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:30