GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)

相关资源打包下载:

 
夏天的风还是吹到了2025年。
 
今天我们来认识一下GCC。在软件逆向工程中,经常会遇见使用GCC编译的应用程序,所以,了解它也就成为了必然。
 
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-CFortranJavaAdaGo语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由
 
先谈谈与GCC相关的产品:https://www.mingw-w64.org/downloads/

图片[1]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

图片[2]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

看的肯定眼花缭乱了,简单把官网的内容给大家翻译介绍一下:

🌟 一、GCC 是什么?

GCC(GNU Compiler Collection) 是 GNU 提供的开源编译器套件,支持多种语言(如 C、C++、Fortran、Ada 等),最初是为 Linux 和类 Unix 系统开发的

  • GCC 是一个“编译器前端 + 后端”的整体架构,可以输出不同平台的可执行文件。

  • GCC 是开源软件,在 Linux 上非常流行,编译器的“金标准”。


🌟 二、MinGW / MinGW-W64 是什么?

🧱 MinGW(Minimalist GNU for Windows)

  • 是把 GCC 移植到 Windows 的一个项目,让你可以在 Windows 上使用 GCC 编译器来生成 原生 Windows 可执行程序(.exe)

  • 它使用 Windows 的 C Runtime(msvcrt.dll)而不是 POSIX。

  • 功能有限,不再活跃维护

🧱 MinGW-W64

  • 是 MinGW 的增强版,由另一个团队开发,支持 64 位和 32 位 Windows 程序,还支持更多的 Windows API。

  • 它集成了 GCC(Windows 版本)+ Windows API 头文件和库 + POSIX 兼容层(可选)

  • 现在主流都是用 MinGW-W64 来在 Windows 下用 GCC 开发

📌 总结:MinGW-W64 = GCC for Windows + 更完整的 Windows 支持


🌟 三、Cygwin 是什么?

Cygwin 是一个在 Windows 上模拟 Linux 环境的工具集

  • 它提供了一个 POSIX 兼容层 + Bash shell + Unix 工具(ls、cat、grep 等)。

  • 它也包含一个移植到 Windows 的 GCC 编译器(带 POSIX 支持)。

  • 用 Cygwin 编译出来的程序依赖一个叫 cygwin1.dll 的运行时。

📌 也就是说:

  • Cygwin 是更偏向于“把 Windows 变得像 Linux”,适合移植 Linux 工具

  • 编译出来的程序不是完全原生的 Windows 可执行文件(依赖 Cygwin DLL)。


🌟 四、LLVM-MinGW 是什么?

LLVM-MinGW 是基于 LLVM/Clang 的 MinGW 替代品

  • 和 MinGW-W64 一样,它用的是 MinGW-W64 的头文件和库,但后端编译器换成了 Clang(不是 GCC)

  • 生成的是 Windows 原生可执行文件(不依赖 Cygwin)。

  • 更容易和一些现代工具链(比如 Visual Studio Code、Rust 等)集成。

📌 简单来说:

  • LLVM-MinGW = Clang 编译器 + MinGW-W64 提供的 Windows 头文件和库。

  • 用于生成原生 Windows 程序,但不是用 GCC,而是 Clang。


✅ 总结对比

名称 编译器核心 是否生成原生 Windows 程序 是否依赖 DLL 是否 POSIX 兼容 是否推荐使用
GCC(原版) GCC 否(为 Linux 用) 是(类 Unix) Linux 上用
MinGW GCC 是(32位) 不推荐
MinGW-W64 GCC ✅ 是(32/64位) ✅ 推荐
Cygwin GCC 否(需 cygwin1.dll) ✅ 是 ✅ 是 特殊场合使用
LLVM-MinGW Clang ✅ 是 推荐(更现代)

如果是 C++ 学习者或开发者,推荐选用 MinGW-W64 或 LLVM-MinGW 来在 Windows 下开发。

下载:

MinGW-w64:https://github.com/niXman/mingw-builds-binaries/releases

LLVM-MinGW:http://releases.llvm.org/download.html

MinGW-w64安装方法

1.点击下载,下载完成后,直接解压

图片[3]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

关于某些特定名词是的解释

【1.基本名词解释】
15.1.0
是GCC的版本号;
目标操作系统和API风格

32
32位的操作系统,选择i686,64位的操作系统,选择x86_64;

posix
这是为类Unix系统(如Linux和macOS)设计的API风格。如果你的程序需要在这些系统上运行,或者你的代码依赖于POSIX API,你应该选择带有posix的工具链。

win32
这是为Windows系统设计的API风格。如果你的程序主要面向Windows用户,或者你的代码依赖于Windows特有的API,你应该选择带有win32的工具链。

【2.异常处理机制】
sjlj
表示这个工具链使用“Setjmp/Longjmp”异常处理机制。SJLJ是一种更传统的异常处理方式,它通常用于那些不支持或不完全支持Windows结构化异常处理(SEH)的操作系统。

seh
:表示这个工具链使用Windows的结构化异常处理(Structured Exception Handling, SEH)。SEH是Windows平台上常用的异常处理机制,它提供了更丰富的异常信息和更灵活的异常处理逻辑。如果你的代码需要与Windows平台的特性紧密集成,或者你的程序主要运行在Windows上,SEH可能是一个更好的选择。

【3.运行时库】
ucrt
是Universal C Runtime的缩写,它是Windows 10及更高版本中包含的一个新运行时库。它提供了与操作系统更紧密集成的API,并通常用于更现代的Windows应用程序。
如果你的目标平台是Windows 10或更高版本,并且你希望利用最新的API和功能,ucrt可能是一个好选择。
使用ucrt的库通常比使用msvcrt的库更小,因为它们不包含一些旧的、不再需要的API。

msvcrt
是Microsoft C Runtime的缩写,它是Microsoft提供的传统C运行时库。
它提供了广泛的API支持,包括一些旧的、可能不再常用的API。
如果你的代码依赖于msvcrt特有的API,或者你需要确保你的程序能在较旧的Windows版本上运行,msvcrt可能更适合你。

rt_v11
通常指的是“runtime”,即运行时库版本号。

【4.压缩格式】
.7z
这是文件的压缩格式。.7z是7-Zip
压缩工具使用的文件格式。它表示文件已经被压缩,以减小文件大小,方便下载和存储。要使用文件中的内容,用户通常需要使用7-Zip或其他兼容的压缩工具来解压缩文件。

2.设置系统变量MinGW_HOME

图片[4]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

然后新建一个Path%MinGW_HOME%\bin

图片[5]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

3.打开cmd,输入gcc -v,如果提示这样,说明成功配置好环境了

图片[6]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

mingw-w64编译64位程序

编译测试,随便找一个.c文件,然后输入gcc 文件名.c -o hello,目录下就会生成一个程序,默认为64位

图片[7]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

mingw-w64编译32位程序

上面这个版本的安装环境是无论如何都无法编译32位程序的,想要编译,就需要在这个地方下载:
这两个都可以,如果你是64位操作系统那么都可以用,如果你是32位操作系统,那下载第一个
 
 
 
为什么异常处理库选择sjlj库,因为它可以同时支持32位和64位程序的异常处理。
 
配置方法是一样的

图片[8]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

然后C语言代码目录下执行gcc -m32 阶段101.c -o hello32即可编译生成文件了

图片[9]-GCC杂谈:mingw-w64编译32位程序和64位程序(无坑酸爽版)-工具资源论坛-技术社区-学技术网

 如果你想在这个版本生成64位程序,也可以,输入gcc -m64 阶段101.c -o hello64即可

其他命令行拓展

1.常用命令基本解释

编译选项说明如下:

-m32表示编译32位程序,-m64表示编译64位程序。

-O2表示编译Release版,以最快执行速度优化;默认编译Debug版。

-o指定可执行文件名称

🔹 基本用法

gcc file.c -o output      # 编译并生成可执行文件 output

🔹 编译控制

-c              # 只编译生成 .o 文件,不链接
-o file         # 指定输出文件名
-v              # 显示详细编译信息

🔹 架构与平台

-m32            # 生成 32 位程序
-m64            # 生成 64 位程序(默认)

🔹 调试与优化

-g              # 生成调试信息(gdb用)
-O0             # 无优化
-O1             # 一般优化
-O2             # 更强优化(推荐)
-O3             # 最大优化

🔹 预处理器相关

-E              # 只运行预处理器,输出宏展开结果
-DMACRO=VALUE   # 定义宏
-IMyInclude     # 添加头文件搜索路径

🔹 链接控制

-Ldir           # 指定库搜索目录
-lname          # 链接库(libname.a / libname.dll)
-static         # 静态链接(避免依赖 DLL)
-shared         # 生成 DLL(.so/.dll)

🔹 警告与错误控制

-Wall           # 打开所有常规警告
-Wextra         # 更多警告
-Werror         # 将警告当作错误处理

🔹 多文件编译

gcc a.c b.c -o output     # 多文件一起编译
gcc -c a.c                # 编译 a.c 为 a.o
gcc -c b.c                # 编译 b.c 为 b.o
gcc a.o b.o -o output     # 链接生成 output
请登录后发表评论