📁
loongsoncsprj2020-manual
  • 1. 简介
  • 1.1龙芯实验箱介绍
  • 1.2实验箱测试流程
  • 2. 基于FPGA的MIPS32SCPU实现
    • 2.1 Vivado开发环境
      • 2.1.1 Vivado环境的安装
      • 2.1.2 Vivado的基本使用
      • 2.1.3 Vivado和实验板的连接
    • 2.2 基于soc_up的移植过程
      • 2.2.1 Flash的烧录
      • 2.2.2 FPGA固化方法
      • 2.2.3 串口工具的使用
      • 2.2.4 TFTP服务器的搭建及使用
      • 2.2.5 Liunx内核的移植过程
    • 2.3 ROM的初始化
      • 2.3.1 ROM的初始化过程
      • 2.3.2 测试程序编译流程
    • 2.4 基于NaiveMIPS的移植过程
      • 2.4.1 NavieMIPS的综合运行
      • 2.4.2 supervisor的启动过程
      • 2.4.3 U-Boot的启动过程
      • 2.4.4 ucore的启动过程
    • 2.5 ILA的使用方法
  • 3. MIPS32S CPU上的ucore教学操作系统
    • 3.1 make 命令的使用
    • 3.2 交叉工具链介绍
    • 3.3 交叉编译环境的配置
    • 3.4 U-Boot的移植过程
    • 3.5 QEMU介绍
    • 3.6 ucore编译方法
    • 3.7 龙芯编译环境配置
    • 3.8 对supervisor交互程序term.py的修改
  • 4. MIPS32S上的C0编译器实验
  • 系统集成
Powered by GitBook
On this page
  • Target triplet (目标三元组)
  • Binutils
  • ld
  • as
  • objdump
  • objcopy
  • GCC
  • gcc

Was this helpful?

  1. 3. MIPS32S CPU上的ucore教学操作系统

3.2 交叉工具链介绍

Previous3.1 make 命令的使用Next3.3 交叉编译环境的配置

Last updated 5 years ago

Was this helpful?

Target triplet (目标三元组)

在准备交叉编译工具链时,需要确定目标机器的架构、环境,才能选择出合适的工具链配置。工具链的配置以Target triplet表示。其基本格式为:

machine-vendor-os

machine代表目标的架构,即目标所使用的CPU类型和配置。需要注意的是,同样的CPU,在不同字节序下工作时所对应的machine并不相同。具体可以参照。常见的machine列表如下:

CPU

machine

80386

i386

64位PC CPU

x86_64或amd64

MIPS32 Big endian

mips

MIPS32 Little endian

mipsel

vendor可以用来对工具链的架构进行细节的配置。当不需要深入配置时,可以将其设为unknown或直接省略。在ucore开发中,需要注意的是,如果使用的CPU没有浮点运算指令,vendor需要包括softfloat,避免工具链生成不支持的指令。

os指定目标的操作系统环境,一般包括系统名称以及基础C库名称。该项可以设定工具链的一些默认行为,例如目标文件格式和连接时自动使用的C库等。ucore运行不依赖于外部的软件,因此该项影响不大,可以直接设为常见的linux-gnu,也可以设为ucore-elf。

需要注意的是,对应同样的目标可能有多种不同的Target triplet。在选择具体的工具链时,只需要一种满足需要的即可。例如,在准备对应于MIPS32 Big endian算的ucore工具链时,可以选择如下的Target triplet:

  • mips-softfloat-linux-gnueabi

  • mipsel-linux-gnu (Debian/Ubuntu)

在Debian/Ubuntu下,可以直接执行apt-get install binutils-mipsel-linux-gnu gcc-mipsel-linux-gnu安装需要的工具。

Binutils

命令

说明

ld

GNU连接器

as

GNU汇编器

objdump

可以查看目标文件内容、进行反汇编等

objcopy

可以复制、修改目标文件

使用交叉编译工具链时,需要在命令前附加目标的Target triplet,例如,要使用mips-linux-gnu的as,应该使用的命令为mips-linux-gnu-as。

ld

  • ld连接多个目标文件。作为参数的目标文件的先后顺序对连接结果有影响。

  • 需要生成静态文件时,输入只能包括静态库(.a)或目标文件(.o)。

格式:ld [选项] 目标文件

常用选项:

  • -o <文件> 设置输出文件

  • -L <目录> 设置库搜索路径

  • -l <库名> 在库搜索路径中寻找对应的库并加入链接

  • -T <脚本> 使用自定义连接器脚本

as

  • as需要不含预处理的汇编程序(一般以.s作为文件名结尾)。如果需要进行预处理(文件名以.S结尾),可以使用gcc汇编或自行调用cpp预处理。

  • 不同架构的汇编语言有不同的语法。

格式:as [选项] [文件] 当不指定输入文件时,as从标准输入读入源程序。

常用选项:

  • -o <文件> 设置输出文件

objdump

格式:objdump [选项] [文件]

当不制定输入文件时,默认使用a.out。

常用选项:

  • -h 查看Section headers。列出目标文件内所有段的信息。

  • -t 查看符号表。

  • -x 查看所有区块信息。相当于-a -f -h -p -r -t(Archive信息、文件头、Section headers、文件格式特有的信息、重定位信息、符号表)。

  • -d 反汇编所有可执行段。该操作会产生相当多的输出,一般应将输出重定向到文件或编辑器。

  • -j 限定仅处理某个段。

  • -s 输出段的内容。一般与-j连用。

objcopy

格式:objcopy [选项] <输入> [输出]

若不指定输出文件,将会直接删除输入文件并使用输入的文件名。

常用选项:

  • -I <bfdname> 指定输入格式

  • -O <bfdname> 指定输出格式

  • -j <段名> 限定仅处理某个段

常见用法:

提取.text段:

$ objcopy -Obinary -j .text bootsect.elf bootsect.mbr

该命令从bootsect.elf中提取.text段(代码段),存入bootsect.mbr,对段的内容不进行改动。

GCC

与Binutils相同,使用交叉编译工具链时,需要在命令前附加目标的Target triplet。要使用mips-linux-gnu的gcc,应该使用的命令为mips-linux-gnu-gcc。

gcc

GCC的C编译器。一般用来编译C程序,也可以进行连接或汇编带预处理的汇编语言。GCC所支持的选项根据不同版本有所不同。

格式:gcc [选项] 输入

常用选项:

  • -o <输出> 指定输出文件名

  • -c 仅进行编译而不连接

  • -I 设定预处理include搜索路径

  • -Wall 开启大部分警告

  • -std=<标准> 设定C语言标准

  • -ffreestanding 设定运行环境为freestanding,即无标准库

常见用法:

编译程序至目标文件:

$ gcc -std=c99 -I ../include -Wall -c -o mm.o mm.c

该命令编译mm.c,在../include以及系统头文件中搜索#include所引用的头文件,并且对大多数可能存在问题的地方提出警告,最终将结果输出至mm.o。

包括汇编器、连接器以及许多用来操作目标文件的工具。常用的工具有:

GNU连接器,可以根据进行连接。

GNU汇编器,根据汇编程序产生目标文件。

显示目标文件信息。

修改目标文件。

包括一系列编程语言的编译器以及语言的底层库。在ucore的开发中,仅使用其C编译器(gcc)。

Installing GCC
GNU Binutils
连接器脚本
文档
文档
文档
文档
GCC(GNU Compiler Collection)