前文《C语言使用MinGW中的GCC生成平面(flat)二进制文件》中有介绍MinGW中使用GCC生成编写操作系统内核所需要的32位平面(flat)二进制文件。但是如果想要在Loader中使用C语言,即编译16位的汇编与C混合代码,就必须使用ELF格式才能转换成16位平面(flat)二进制文件。MinGW默认的GCC只能生成PE文件,不能生成ELF文件,而pei-386是无法转换成16位平面(flat)二进制文件的。

如果在link.ld中使用OUTPUT_FORMAT("pei-i386"),会报错:

mingw32/bin/ld.exe: unsupported PEI architecture: pei-i386

使用使用OUTPUT_FORMAT("binary"),则会报:

mingw32/bin/ld.exe: cannot perform PE operations on non PE output file 'loader.bin'

所以为了能使用MinGW编译16位汇编与C语言的混合代码,就必须编译一个交叉编译器。

下面笔者就以最新的GCC 12.1为例,介绍如何通过MinGW来构建GCC的交叉编译器。笔者的MinGW为MSYS2中的MinGW64。

一、下载Binutils

去https://ftp.gnu.org/gnu/binutils/下载最新的binutils,目前最新的为binutils-2.38.tar.xz

二、下载GCC

去https://ftp.gnu.org/gnu/gcc/下载最新的GCC,目前最新的为gcc-12.1.0.tar.gz

三、解压、编译

1.解压

$HOME下新建一个目录,比如src,然后将下载的binutils-2.38.tar.xz以及gcc-12.1.0.tar.gz解压到$HOME/src

2.编译binutils

在编译之前后设置如下环境变量:

export PREFIX="/opt/cross"
export TARGET=i686-elf
export PATH="$PREFIX/bin:$PATH"

如果是想编译成64位的则把TARGET设置为x86_64-elf

然后编译、安装binutils

cd $HOME/srcmkdir build-binutils
cd build-binutils
../binutils-2.38/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
make
make install

3. 编译、安装GCC

cd $HOME/src# $PREFIX/bin目录必须在路径中,不然找不到as汇编器
which -- $TARGET-as || echo $TARGET-as is not in the PATH# 进入GCC目录下载必要的依赖
cd gcc-12.1.0/
./contrib/download_prerequisites
cd ..mkdir build-gcc
cd build-gcc
../gcc-12.1.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc

注意安装时的提示,后面可能会有用:

----------------------------------------------------------------------
Libraries have been installed in:/opt/cross/libexec/gcc/i686-elf/12.1.0If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:- add LIBDIR to the `PATH' environment variableduring execution- add LIBDIR to the `LD_RUN_PATH' environment variableduring linking- use the `-LLIBDIR' linker flagSee any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

编译完成后就可以在$HOME/opt/cross目录下看到相应的程序了:
使用ld -V查看支持的格式:

可以看到已经支持elf_i386了。Btw:从图中可以看到生成的文件都比较大,像i686-elf-lto-dump.exe达370多M,可以通过使用strip命令删除调试信息来瘦身,在所有生成的exe目录使用:

strip *.exe

以下是瘦身后的大小情况:

4.编译、安装GDB

下载最新的GDB,目前为gdb-12.1,设置好环境变量后,使用下面的命令进行编译,安装:

$../gdb-12.1/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-multilib --disable-werror
$make -j8
$make install

5.设置路径

为了使用编译好的交叉编译器和调试器,需要添加到路径,编辑~/.bashrc文件,添加一行:

PATH=$PATH:/opt/cross/bin

如果编译遇到麻烦,或者不想自己编译也可以使用别人编译好的,参见:https://wiki.osdev.org/GCC_Cross-Compiler#Prebuilt Toolchains

有了交叉编译器和调试器,就可以使用MinGW构建16位应用程序了,同时也可以进行调试,有兴趣的话请关注后面的博文。

参考资料:
https://wiki.osdev.org/GCC_Cross-Compiler

在MinGW中构建GCC交叉编译器和GDB交叉调试器相关推荐

  1. GCC下载地址(linux/windows\安装)或从minGW中取得gcc

    Linux中自带GCC,或者可以通过包管理器来取得/更新GCC: Windows一般需要自行下载安装GCC,网址如下: 当然,直接下载另一个更容易下载的编译器minGW会更加方便,如果希望使用gcc而 ...

  2. 看完这篇带你完全理清IDE、编辑器、编译器、解释器和调试器的概念

    IDE.编辑器.编译器.解释器与调试器 写在前面 IDE 编辑器 编译器 解释器 调试器 编译器和解释器的区别和优缺点 编译器和调试器的区别 写在前面 对于这些概念,简单记录一下自己的理解,如果有不对 ...

  3. 【ubuntu安装交叉编译器】安装交叉编译器

    文章目录 ubuntu下安装交叉编译器 (1)安装方法一 (2) 安装方法二 ubuntu下安装交叉编译器 (1)安装方法一 打开ubuntu终端 使用sudo apt list gcc-arm*可以 ...

  4. 【教程】制作能在ARM板上直接运行的gcc本地编译器

    编译好的程序的下载链接:百度网盘 请输入提取码(提取码:ocmm) 概述 通常情况下,我们是在电脑里面开一个Linux虚拟机, 在虚拟机里面用交叉编译工具链编译好可执行文件后,将可执行文件拷贝到板子里 ...

  5. Linux账户标识R=400是什么意思_带你阅读linux内核源码:通俗讲解编译器、交叉编译器和大小端...

    欢迎关注"技术简说",持续分享linux内核和驱动开发干货. 本文内容包括: 编译器和交叉编译器的介绍 交叉编译器的命名规则 如何交叉编译C代码 大端.小端的通俗讲解 如何判断你的 ...

  6. arm系列交叉编译器各版本区别

    目录 交叉编译器命名规则 具体编译器举例 crosstool-ng交叉编译工具样本 arm交叉编译器举例 几个概念 ABI与EABI gnueabi与gnueabihf 参考 交叉编译器命名规则 交叉 ...

  7. W5300E01-ARM 交叉编译器(Cross Compiler)用户手册

    W5300E01-ARM是基于W5300的ARM功能测试评估板: 1      简介 当用户的开发环境与目标系统不同时就会用到交叉编译器. 例如,当开发基于ARM的嵌入式系统时,用户就需要在电脑上写出 ...

  8. Linux下安装和配置ARM交叉编译器

    本篇为基于Linux-Ubuntu20.04下配置安装ARM交叉编译器,"arm-linux-gcc交叉编译器"云盘链接放置文章底部,有需要可自提 1. 第一步 在windows下 ...

  9. 【Linux从青铜到王者】第四篇:Linux开发项目之编译器和调试器

    系列文章目录 文章目录 系列文章目录 前言 一.Linux编译器-gcc/g++使用 1.背景知识 2.gcc/g++如何完成 1.预处理(进行宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别 ...

  10. qt 编译器 调试器

    电脑版本:win10  64位 qt版本:based on Qt 5.14.0(msvc 2017, 32位) Qt Creator 4.11.0 qt安装包:qt-opensource-window ...

最新文章

  1. iOS性能分析-Xcode Instruments Allocations 分析APP内存使用情况
  2. struts config xml详细解释
  3. 10月第3周安全回顾:恶意软件肆虐 Web安全重点关注
  4. Linux中命令行终端切换工具screen
  5. JS搜索省份匹配出省份的所有城市
  6. mac使用vscode
  7. 什么是增量绩效管理?华为是如何做
  8. Eclipse安装反编译工具Eclipse Class Decompiler:实现不下载源码,查看源文件
  9. 比Gmail更强悍:超大3GB免费邮箱申请!
  10. 【2021年蓝桥省赛真题】赛前最后冲刺,省一我来啦
  11. [NWERC 2019] E. Expeditious Cubing 浮点数精度判断
  12. 外刊逐句精读|《经济学人》:戒酒、吃素,禁食都有啥讲究?
  13. 微信群发软件哪个好?好用的群发软件选择
  14. win8修改炉石服务器,炉石传说如何去其他服务器玩炉石
  15. 综艺节目php灭灯_非诚勿扰php程序员 被全灭灯的是哪一期 求知道
  16. qt html 字体加粗,Qt 之字体设置(QFont)详解
  17. 敏捷开发中QA如何做质量管理?
  18. 原来代码可以写成爱情故事
  19. 数据立方体(Cube)
  20. 物联网传输协议总结笔记

热门文章

  1. 智能合约语言Solidity教程系列2 - 地址类型介绍
  2. 小程序--模板的使用 说明--详细版的
  3. 随机生成姓名,姓名生成器
  4. 三维GIS+电力巡检,开启电缆通道数字化巡检新局面
  5. Java常见异常类【整理】
  6. 桌面共享工具(可以实现RTMP直播、K歌、投屏等功能)
  7. android 动画中插值器Interpolator详解
  8. FileNet入门学习
  9. c语言二元一次方程代码,二元一次方程(示例代码)
  10. mysql测评作业指导书_测评作业指导书