当前位置: 首页 > news >正文

LFS学习系列 第5章. 编译交叉工具链(1)

5.1 介绍

本章介绍如何构建交叉编译器及其相关工具。尽管这里的交叉编译是“伪造”、“假装”的,但其原理与真正的交叉工具链相同。 

本章中编译的程序将安装在$LFS/tools目录下,以使它们与以下章节中安装的文件分离。而另一方面,库被安装到它们的最终位置,因为它们属于我们想要构建的系统。

5.2. Binutils-2.41 - 第一遍

Binutils包包含一个链接器、一个汇编器和其它用于处理对象文件的工具。

所需磁盘空间:647MB。

5.2.1. 交叉Binutils的安装

注:

返回并重读“iii. General Compilation Instructions(一般编译指导)”部分中的注释。理解标记为“重要”的注意事项可以在以后省去很多问题。

这很重要,Binutils是编译的第一个包,因为Glibc和GCC都会对可用的链接器和汇编器执行各种测试,以确定要启用它们自己的哪些功能。

Binutils文档建议在专用的构建目录中构建Binutils:

mkdir -v build
cd       build

注:

为了使本书其余部分中列出的SBU值具有任何用途,请测量从配置到第一次安装(包括第一次安装)构建此软件包所需的时间。要轻松实现这一点,请将命令封装在时间命令中,如下所示:time{../configure…&&make&&makeinstall;}。

现在准备进行Binutils编译:

../configure --prefix=$LFS/tools \--with-sysroot=$LFS \--target=$LFS_TGT   \--disable-nls       \--enable-gprofng=no \--disable-werror

各配置选项的含义:

  • --prefix=$LFS/tools

此项告诉配置脚本准备在$LFS/tools目录中安装Binutils程序。 

  • --with-sysroot=$LFS

对于交叉编译,此项告诉构建系统根据需要在$LFS中查找目标系统库。

  • --target=$LFS_TGT

由于LFS_TGT变量中的机器描述与config.guess脚本返回的值略有不同,因此此开关将告诉configure脚本调整binutils的构建系统以构建交叉链接器。

  • --disable-nls

此项将禁用国际化,因为临时工具不需要i18n。 

  • --enable-gprofng=no

这将禁用临时工具不需要的构建gprofng。

  • --disable-werror

此项可以防止在主机的编译器发出警告时中止编译。

接着编译(源码)包:

make

安装(Binutils)包:

sudo make install

知识补充(以下内容参考GNU Binutils 介绍):

Binutils介绍

从事 Linux 开发的朋友们都不可避免地用到一些工具,比如 objcopy、nm、objdump、readelf 等等。其实这一系列的工具,就是所谓的 Binutils,当然 GNU 就表示它们都是可以自由地使用的 GNU 软件。

GNU Binutils,是 GNU Binary Utilities 的简写,一般简称为 Binutils。中文可以翻译为 GNU 的二进制工具集。显然,Binutils 是一组二进制工具的集合。也就是说,Binutils 不是指某一个工具,而是指一组工具,并且这些工具都是专门针对于二进制的。注意,这里千万不要理解错了,不是说这些 Binutils 工具只提供二进制文件,而是说这些工具的目的是用于操作二进制文件的,而不是针对于文本或者源代码。

再说一遍:Binutils 工具是专门用于操作二进制的,而不是用于去操作或者编译文本、源代码的。在 Linux 环境下,这种二进制文件主要指 *.o 文件和 elf 执行文件。显然,编译源代码的是 gcc,所以 Binutils 不包含 gcc(这是一种简单的说法,实际上还是有很多关联的)。

Binutils 工具

现在我们已经知道,Binutils 是一组工具集合,那到底包含了哪些工具呢?Binutils 中比较重要的是 ld 和 as。

ld —— 链接器
将多个目标文件,链接成一个可执行文件(或目标库文件)。

as —— 汇编器
将汇编源代码,编译为(目标)机器代码。

addr2line
将地址转换为(文件名和)行号的工具,一般主要用于反汇编。

ar
用来操作(.a)档案文件,比如创建,修改,提取内容等

c++filt
Filter to demangle encoded C++ symbols

dlltool
Creates files for building and using DLLs

gold
一个新的,速度更快的,只针对于ELF的链接器(可能还不是很成熟稳定)。

gprof
Displays profiling information

nlmconv
Converts object code into an NLM

nm
列出目标文件中的符号

objcopy
拷贝并翻译(转换)文件,可用于不同格式的二进制文件的转换。

objdump
显示目标文件中的信息。

ranlib
Generates an index to the contents of an archive

readelf
显示 ELF 格式的(目标)文件的信息。

size
显示目标文件或(.a)档案文件中的节(section)的大小。

strings
显示文件中的(可打印)的字符串信息。

strip
去除符号。一般用来把可执行文件中的一些信息(比如 debug 信息)去除掉,以实现在不影响程序功能的前提下,减少可执行文件的大小,减少程序的空间占用。

windmc
A Windows compatible message compiler

windres
A compiler for Windows resource files

http://www.lryc.cn/news/137782.html

相关文章:

  • 网络互联与互联网 - TCP 协议详解
  • 开源在线图片设计器,支持PSD解析、AI抠图等,基于Puppeteer生成图片
  • 在Linux系统上安装和配置Redis数据库,无需公网IP即可实现远程连接的详细解析
  • 跨平台图表:ChartDirector for .NET 7.1 Crack
  • 【unity数据持久化】XML数据管理器知识点
  • Linux——Shell常用运算符
  • C++(4)C++内存管理和命名空间
  • 一网打尽java注解-克隆-面向对象设计原则-设计模式
  • k8s-statefulset部署myql-Nodeport方式
  • MySQL双主架构、主从架构
  • 基于微信小程序的物流管理系统3txar
  • Maven 一键部署到 SSH 服务器
  • docker搭建owncloud,Harbor,构建镜像
  • RISC-V(1)——RISC-V是什么,有什么用
  • 基于黄金正弦算法优化的BP神经网络(预测应用) - 附代码
  • Python标准库概览
  • 两个列表的最小索引总和
  • Go语言基础之切片
  • 关于java三元组的问题
  • 如何正确地设置Outlook SMTP发送电子邮件(wordpress配置)
  • 机器学习编译系列---张量程序抽象
  • python使用matplotlib实现折线图的绘制
  • 网络协议的定义、组成和重要性?
  • vue 使用print.js打印小票
  • 算法通关村第6关【白银】| 树的层次遍历问题
  • Qt与电脑管家3
  • Jmeter 快速生成测试报告
  • 消息队列——RabbitMQ(一)
  • 人工智能在机器学习中的八大应用领域
  • vue3+ts使用vue-i18n