GCC编译器原理(一)05------GCC 工具:readelf、size、strings、strip和 windres

发布者:JoyfulExplorer最新更新时间:2024-08-22 来源: cnblogs关键字:GCC编译器  GCC  工具  readelf  size 手机看文章 扫描二维码
随时随地手机看文章

1.3.18 readelf:elf 文件格式分析工具

这个工具和 objdump 命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖 BFD 库( BFD 库是一个 GNU 项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件);

ELF 文件类型 ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF 是构成众多 xNIX 系统的基础之一。

  • ELF文件有三种类型:

    • 可重定位的对象文件(Relocatable file) 由汇编器汇编生成的 .o 文件

    • 可执行的对象文件(Executable file) 可执行应用程序

    • 可被共享的对象文件(Shared object file) 动态库文件,也即 .so 文件

  • ELF文件的节:

    • text section 里装载了可执行代码

    • data section 里面装载了被初始化的数据;

    • bss section 里面装载了未被初始化的数据;

    • 以 .rec 打头的 sections 里面装载了重定位条目;

    • symtab 或者 .dynsym section 里面装载了符号信息;

    • strtab 或者 .dynstr section 里面装载了字符串信息;

参数说明

选项

描述

-a

--all 显示全部信息,等价于 -h -l -S-s -r -d -V -A -I.

-h

--file-header 显示elf文件开始的文件头信息.

-l

--program-headers --segments 显示程序头(段头)信息(如果有的话)。

-S

--section-headers --sections 显示节头信息(如果有的话)。

-g

--section-groups 显示节组信息(如果有的话)。

-t

--section-details 显示节的详细信息(-S 的)。

-s

--syms --symbols 显示符号表段中的项(如果有的话)。

-e

--headers 显示全部头信息,等价于: -h -l -S

-n

--notes 显示note段(内核注释)的信息。

-r

--relocs 显示可重定位段的信息。

-u

--unwind 显示unwind段信息。当前只支持 IA64ELF 的 unwind 段信息。

-d

--dynamic 显示动态段的信息。

-V

--version-info 显示版本段的信息。

-A

--arch-specific 显示CPU构架信息。

-D

--use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。

-x

--hex-dump= 以16进制方式显示指定段内内容。number 指定段表中段的索引,或字符串指定文件中的段名。

-w[liaprmfFsoR]

--debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。

-I

--histogram 显示符号的时候,显示 bucketlist 长度的柱状图。

-v

--version 显示 readelf 的版本信息。

-H

--help 显示 readelf 所支持的命令行选项。

-W

--wide 宽行输出。

@file

可以将选项集中到一个文件中,然后使用这个 @file 选项载入。

1.3.19 size

size 工具,就是列出程序文件中各段的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。

命令使用格式:size [ option ... ] [ object ... ]

选项

描述

-A –B

选择以 sysv | berkeley 的样式输出。

-o | -d | -x

选择输出数据的格式.

-t

选择全部输出

1.3.20 strings

strings 工具在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。 strings 工具对识别随机对象文件很有用。

语法:strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [ file ... ]

选项

描述

-a

--all

扫描整个文件而不是只扫描目标文件初始化和装载段

-f

–print-file-name

在显示字符串前先显示文件名

-n

–bytes=[number]

找到并且输出所有 NUL 终止符序列

-

设置显示的最少的字符数,默认是 4 个字符

-t

--radix={o,d,x}

输出字符的位置,基于八进制,十进制或者十六进制

-o

类似 --radix=o

-T

--target=

指定二进制文件格式

-e

--encoding={s,S,b,l,B,L}

选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit

@

读取中选项

1.3.21 strip

strip 工具通过除去绑定程序和符号调试程序使用的信息,减少扩展公共对象文件格式(XCOFF)的对象文件的大小。

语法 strip [ -V ] [ -r [ -l ] | -x [ -l ] | -t | -H | -e | -E ] [ -X {32 |64 |32_64 }] [ -- ] File ...

strip 命令减少 XCOFF 对象文件的大小。

strip 命令从 XCOFF 对象文件中有选择地除去行号信息、重定位信息、调试段、typchk 段、注释段、文件头以及所有或部分符号表。 一旦使用该命令,则很难调试文件的符号;因此,通常应该只在已经调试和测试过的生成模块上使用 strip 命令。使用 strip 命令减少对象文件所需的存储量开销。

对于每个对象模块,strip 命令除去给出的选项所指定的信息。对于每个归档文件,strip 命令从归档中除去全局符号表。

可以使用 ar -s 命令将除去的符号表恢复到归档文件或库文件中。

没有选项的 strip 命令除去行号信息、重定位信息、符号表、调试段、typchk 段和注释段。

选项

描述

-e

在对象文件的可选头中设置 F_LOADONLY 标志。如果对象文件放置在归档中,则该标志告知绑定程序(ld 命令),在与此归档链接时应忽略该对象文件中的符号。

-E

复位(关闭)对象文件的可选头中的 F_LOADONLY 位。(请参阅 -e 标志。)

-H

除去对象文件头、任何可选的头以及所有段的头部分。注: 不除去符号表信息。

-l

(小写 L)从对象文件中除去行号信息。

-r

除了外部符号和静态符号条目,将全部符号表信息除去。不除去重定位信息。同时除去调试段和 typchk 段。这个选项产生一个对象文件,该对象文件仍可以用作输入到链接编辑器(ld 命令)中。

-t

除去大多数符号表信息,但并不除去函数符号或行号信息。

-V

打印 strip 命令的版本号。

-x

除去符号表信息,但并不除去静态或外部符号信息。 -x 标志同时除去重定位信息,因此将不可能链接到该文件。

-X mode

指定应检查 strip 的对象文件的类型。 mode 必须是下列之一:

  • 32 只处理 32 位对象文件

  • 64 只处理 64 位对象文件

  • 32_64 既处理 32 位对象文件,又处理 64 位对象文件

缺省值是处理 32 位对象文件(忽略 64 位对象文件)。也可以用 OBJECT_MODE 环境变量来设置 mode 。例如,OBJECT_MODE=64 使 strip 处理任何 64 位对象文件,并忽略 32 位对象文件。-X 标志重设 OBJECT_MODE 变量。

--

(双连字符)将跟随在该标志后的所有参数解释为文件名。这就允许除去名称是以连字符开始的文件。

1.3.22 windres

Windows 方面的命令,不涉及


关键字:GCC编译器  GCC  工具  readelf  size 引用地址:GCC编译器原理(一)05------GCC 工具:readelf、size、strings、strip和 windres

上一篇:GCC编译器原理(二)------编译原理一:目标文件
下一篇:GCC编译器原理(一)04------GCC 工具:nlmconv、nm、objcopy、objdump和 ranlib

推荐阅读最新更新时间:2026-02-19 11:28

Keil环境下配置GCC编译器以开发STM32 C语言项目:探讨C语言特性及第23条指南
Keil 配置 GCC 编译器用于 STM32 和 C++23 特性 Keil 配置 GCC 编译器 安装工具链 Arm GNU Toolchain arm-none-eabi 创建Keil工程 前置步骤:获取依赖代码 方式1 使用STM32CubeMX辅助生成 方式2 Github 创建Keil工程 管理工程 添加分组Core/Src 添加分组Core/Startup 添加分组Drivers/STM32F1xx_HAL_Driver 设置GCC工具链(关键) 配置编译目标(重要) 配置编译生成的文件目录 配置C、C++选项 配置汇编选项 配置链接选项 添加函数
[单片机]
Keil环境下配置<font color='red'>GCC编译器</font>以开发STM32 C语言项目:探讨C语言特性及第23条指南
GCC编译器原理(二)------编译原理一:ELF文件(1)
二、ELF 文件介绍 2.1 可执行文件格式综述 相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者。可执行文件的大小、运行速度、资源占用情况以及可扩展性、可移植性等与文件格式的定义和文件加载过程紧密相关。研究可执行文件的格式对编写高性能程序和一些黑客技术的运用都是非常有意义的。 可执行链接格式 ( Executable and Linking Format)最初是由 UNIX 系统实验室 ( UNIX System Laboratories, USL)开发并发布的, 作为应用程序二进制接口 ( Application Binary Interface, ABI)的一部分。
[单片机]
<font color='red'>GCC编译器</font>原理(二)------编译原理一:ELF文件(1)
编译通过的U-boot使用的arm-linux-gcc编译器
说实话编译U-boot挺累人的,要做的修改不是很多,但是在编译器上花的功夫却很多,经常遇到各种奇怪的问题。 下面是编译通过的U-boot和对应的gcc编译器 GCC下载地址:http://download.csdn.net/detail/king_mcu/9002001 U-Boot下载地址:http://download.csdn.net/detail/king_mcu/9002011 说明: 1、arm-linux-gcc解压到linux电脑上后,添加环境变量,这点不用多说,下面是我电脑上的安装路径: 2、解压U-boot到工作目录,修改Makefile中的编译器路径,改为你电脑上arm-linux-g
[单片机]
编译通过的U-boot<font color='red'>和</font>使用的arm-linux-<font color='red'>gcc编译器</font>
Ubuntu 安装arm-linux-gcc编译器
/********************************************************************************** * Ubuntu 安装arm-linux-gcc编译器 * 说明: * Ubuntu下直接安装arm-linux-gcc编译器,省得去配置那些环境。 * * 2017-3-21 深圳 南山平山村 曾剑锋 *********************************************************************************/ 一、参考文档:
[单片机]
Keil5.15使用GCC编译器链接.a库文件
我们知道,当使用第三方的代码时,人家有可能会扔个Lib文件给你.这时候,别人只要提供header文件给你,则你就可以通过Lib文件及header的函数声明,对Lib中的函数进行调用.在Keil中如果使用ARMCC调用Lib文件,相信大家都能从网上找到方法.那如果在Keil中使用GCC来链接第三方GCC编译好的Lib文件—— .a 应该如何呢? 在告诉大家方法之前,我们写个简单的函数,然后用GCC编译器编译产生.a文件,便于我们进行测试. 首先,在Keil中配置gcc编译环境,这个可以参考我的文章. Keil5.15使用GCC编译器编译STM32工程,里面有交大家配置方法. 接下来,将工程配置成生成库方式.这个跟Keil ARMCC
[单片机]
Keil5.15使用<font color='red'>GCC编译器</font>链接.a库文件
Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装
一、什么是交叉编译? 在开发主机运行编译器编译内核、应用程序。内核和程序在目标机上运行,这个编译过程被称为交叉编译。编译器运行在开发主机(通常是X86体系的PC机)上,编译出的的代码是目标机体系结构的,如:ARM。 在主机上除了编译还可以完成制作根文件系统地工作。 嵌入式Linux开发,交叉编译使用开源GNU工具集,gcc等。 二、制作交叉编译器 我们可以自己制作交叉编译器,需要gcc,glibc,二进制工具集 ,通过crosstool,crosstool-ng脚本来实现。这里不展示制作过程。 三、安装交叉编译器 1、解压工具链压缩包 1)将gcc-4.6.4.tar.xz 拷贝到 toolschain文
[单片机]
Exynos4412 Uboot 编译<font color='red'>工具</font> —— 交叉<font color='red'>工具</font>链 arm-linux-<font color='red'>gcc</font> 的安装
使用gcc工具链进行Linux环境下的stm32开发
处于好奇和学习Linux的目的,准备开始在虚拟机VMware的Ubuntu9.10操作系统下搭建stm32的开发环境。整个过程包括:安装gcc工具链---- 建立工程目录--- 编写Makefile,连接文件--- 编译生成可执行文件--- 下载测试。 我的工程资源:http://download.csdn.net/detail/xiaoxiaoxingkongo/9732047 工程建立参考连接:http://blog.csdn.net/embbnux/article/details/17616809 烧录参考链接:http://blog.csdn.net/ybhuangfugui/article/details/52597
[单片机]
arm gcc交叉编译工具链建立
1.1. Arm交叉编译工具链 下载地址Gnu.org binutils-2.21.1.tar.bz2 gcc-4.4.4.tar.bz2 glibc-2.11.2.tar.bz2 Glibc-ports-2.11.tar.bz2 Gmp-4.2.tar.bz2 Mpfr-2.4.0.tar.bz2 1.1.1. 建立工作目录 创建工具链文件夹: # mkdirembedded-toolchains 在建立了顶层文件夹embedded-toolchains,下面在此文件夹下建立如下几个目录: setup-dir,存放下载的压缩包; src-dir,存放binutils、gc
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved