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?

Author: Alexander Shukaev, 2013-10-30

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

  1. libgcc_s_dw2-1.dll (DWARF);
  2. libgcc_s_seh-1.dll (SEH);
  3. 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

  1. sprawdź katalog i plik konstrukcja instalacji MinGW-w64 w nadziei na zlokalizowanie jednego z tych bibliotek DLL (zazwyczaj w bin); lub
  2. 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
  3. 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.
 39
Author: Alexander Shukaev,
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