网站设计的公司排名/看书网站排名

网站设计的公司排名,看书网站排名,网站功能有哪些,商务网站建站1. GNU Binutils 全工具指南:从编译到逆向的完整生态 1. GNU Binutils 全工具指南:从编译到逆向的完整生态 1.1. 引言1.2. 工具分类速查表1.3. 核心工具详解 1.3.1. 编译与汇编工具 1.3.1.1. as(汇编器)1.3.1.2. gcc(…

1. GNU Binutils 全工具指南:从编译到逆向的完整生态

  • 1. GNU Binutils 全工具指南:从编译到逆向的完整生态
    • 1.1. 引言
    • 1.2. 工具分类速查表
    • 1.3. 核心工具详解
      • 1.3.1. 编译与汇编工具
        • 1.3.1.1. as(汇编器)
        • 1.3.1.2. gcc(GNU 编译器集合)
        • 1.3.1.3. cpp(C 预处理器)
      • 1.3.2. 链接与库管理
        • 1.3.2.1. ld(链接器)
        • 1.3.2.2. ar(静态库创建和管理工具)
        • 1.3.2.3. ranlib(更新静态库索引工具)
      • 1.3.3. 分析与诊断工具
        • 1.3.3.1. objdump(目标文件分析工具)
        • 1.3.3.2. readelf(ELF 文件分析工具)
        • 1.3.3.3. nm(符号表查看工具)
        • 1.3.3.4. size(节大小统计工具)
      • 1.3.4. 调试与逆向工具
        • 1.3.4.1. gprof(性能分析工具)
        • 1.3.4.2. addr2line(地址转源代码行号工具)
        • 1.3.4.3. strings(提取可打印字符串工具)
    • 1.4. 三、高级工具与扩展
      • 1.4.1. 符号处理工具
        • 1.4.1.1. strip
        • 1.4.1.2. c++filt
      • 1.4.2. 特殊格式处理
        • 1.4.2.1. windmcwindres
        • 1.4.2.2. elfedit
      • 1.4.3. 实验性工具
        • 1.4.3.1. gold
        • 1.4.3.2. lto-dump
    • 1.5. 典型工作流程示例
      • 1.5.1. 编译与链接
      • 1.5.2. 逆向分析
    • 1.6. 总结

1.1. 引言

GNU Binutils 是开源领域最全面的二进制工具集,覆盖从源代码编译到二进制分析的全流程。它不仅是 Linux 开发的基石,也广泛用于逆向工程、嵌入式开发和软件调试。以下是其核心工具的详细分类与实战用法。

1.2. 工具分类速查表

类别工具列表
核心工具as, gcc, ld, ar, objdump, readelf
符号处理nm, c++filt, strip, ranlib
调试分析gprof, addr2line, strings, size
特殊用途windmc, windres, elfedit, gold, lto-dump
辅助工具m4, bfd, cpp

1.3. 核心工具详解

1.3.1. 编译与汇编工具

1.3.1.1. as(汇编器)
  • 详细功能as 是 GNU 汇编器,它将汇编语言源代码文件(通常以 .s.asm 为扩展名)转换为目标文件(通常以 .o 为扩展名)。在汇编过程中,它会对汇编代码进行语法检查,将汇编指令转换为对应的机器码,并处理符号定义和引用等操作。
  • 示例命令及解释
as -o code.o code.s

此命令将 code.s 汇编源文件汇编成 code.o 目标文件。-o 选项用于指定输出文件的名称。

1.3.1.2. gcc(GNU 编译器集合)
  • 详细功能gcc 是一个强大的编译器集合,支持多种编程语言,如 C、C++、Objective - C 等。它可以对源代码进行预处理、编译、汇编和链接等多个阶段的操作。在编译过程中,它会根据不同的优化选项对代码进行优化,生成高效的可执行文件。
  • 示例命令及解释
gcc -O3 -o app app.c

-O3 选项表示使用最高级别的优化,-o 选项指定输出的可执行文件名为 appapp.c 是要编译的 C 语言源文件。

1.3.1.3. cpp(C 预处理器)
  • 详细功能cpp 主要负责对 C 语言源代码进行预处理操作。它会处理源文件中的预处理指令,如 #include#define#ifdef 等,进行宏替换、文件包含和条件编译等操作,生成预处理后的源文件。
  • 示例命令及解释
cpp input.c -o preprocessed.i

该命令将 input.c 源文件进行预处理,生成的预处理后的文件名为 preprocessed.i-o 选项用于指定输出文件。

1.3.2. 链接与库管理

1.3.2.1. ld(链接器)
  • 详细功能ld 是 GNU 链接器,其主要功能是将多个目标文件和库文件组合成一个可执行文件、共享库或其他类型的二进制文件。在链接过程中,它会处理符号引用和重定位,将各个模块中的代码和数据整合到一起,解决不同模块之间的依赖关系。
  • 示例命令及解释
ld -o app code.o

此命令将 code.o 目标文件链接成可执行文件 app-o 选项指定输出文件的名称。

1.3.2.2. ar(静态库创建和管理工具)
  • 详细功能ar 用于创建、修改和提取静态库(通常以 .a 为扩展名)。静态库是多个目标文件的集合,在链接时可以被链接器使用,方便代码的复用和管理。
  • 示例命令及解释
ar rcs libutils.a util1.o util2.o

r 选项表示将目标文件插入到静态库中,如果库中已存在同名文件则替换;c 选项表示创建静态库,如果库不存在则创建;s 选项表示为静态库生成索引。此命令将 util1.outil2.o 目标文件打包成静态库 libutils.a

1.3.2.3. ranlib(更新静态库索引工具)
  • 详细功能ranlib 为静态库生成或更新符号索引,以便链接器能够更快地查找和使用静态库中的符号。在使用 ar 创建或修改静态库后,通常需要使用 ranlib 来更新索引。
  • 示例命令及解释
ranlib libutils.a

该命令会更新 libutils.a 静态库的符号索引。

1.3.3. 分析与诊断工具

1.3.3.1. objdump(目标文件分析工具)
  • 详细功能objdump 可以显示目标文件(如可执行文件、目标文件、共享库等)的各种信息,包括文件头信息、节信息、符号表、重定位表等,还可以进行反汇编操作,将机器码转换为汇编代码,帮助开发者深入了解二进制文件的内部结构。
  • 示例命令及解释
objdump -dS app

-d 选项表示对可执行部分进行反汇编,-S 选项表示如果目标文件是使用调试信息编译的(使用 -g 选项),则会将源代码和反汇编代码混合显示。此命令会将 app 可执行文件反汇编并混合显示源代码(前提是有调试信息)。

1.3.3.2. readelf(ELF 文件分析工具)
  • 详细功能readelf 专门用于分析 ELF(Executable and Linkable Format)格式的文件,如可执行文件、目标文件和共享库。它可以显示 ELF 文件的详细信息,包括文件头、程序头、节头、符号表等,帮助开发者深入了解 ELF 文件的结构和内容。
  • 示例命令及解释
readelf -a app

-a 选项表示显示 ELF 文件的所有信息,此命令会输出 app 可执行文件的全面 ELF 信息。

1.3.3.3. nm(符号表查看工具)
  • 详细功能nm 用于显示目标文件中的符号表信息,包括符号的名称、地址、类型等。符号表记录了程序中定义和引用的全局变量、函数等信息,通过 nm 可以方便地查看这些信息,帮助开发者分析程序的结构和依赖关系。
  • 示例命令及解释
nm -D /lib/libc.so.6

-D 选项表示显示动态符号表,此命令会显示 /lib/libc.so.6 共享库的动态符号表信息。

1.3.3.4. size(节大小统计工具)
  • 详细功能size 可以显示目标文件或可执行文件中各节(section)的大小,帮助开发者分析程序的内存占用情况,了解代码段、数据段等的大小分布。
  • 示例命令及解释
size app

该命令会输出 app 可执行文件中 .text(代码段)、.data(已初始化数据段)、.bss(未初始化数据段)等节的大小。

1.3.4. 调试与逆向工具

1.3.4.1. gprof(性能分析工具)
  • 详细功能gprof 用于分析程序的性能,通过收集程序运行时的统计信息,生成程序的调用图和各个函数的执行时间等信息,帮助开发者找出程序中的性能瓶颈,进行性能优化。
  • 示例命令及解释
gprof app gmon.out

在程序运行前,需要使用 -pg 选项编译程序,程序运行后会生成 gmon.out 文件,此命令将 app 程序的性能分析信息从 gmon.out 文件中提取出来并进行分析。

1.3.4.2. addr2line(地址转源代码行号工具)
  • 详细功能addr2line 可以将程序地址转换为对应的文件名和行号,常用于调试时定位崩溃或错误的位置。当程序出现段错误等异常时,可以通过获取错误地址,使用 addr2line 工具找到对应的源代码位置。
  • 示例命令及解释
addr2line -e app 0x400567

-e 选项指定可执行文件,此命令将 app 可执行文件中的地址 0x400567 转换为源代码中的位置。

1.3.4.3. strings(提取可打印字符串工具)
  • 详细功能strings 用于提取二进制文件中的可打印字符串,常用于逆向工程或查找隐藏信息。在分析二进制文件时,可以通过提取其中的字符串来获取一些有用的信息,如版权信息、配置信息等。
  • 示例命令及解释
strings -n 10 app

-n 选项指定字符串的最小长度,此命令会显示 app 可执行文件中长度大于等于 10 的可打印字符串。

1.4. 三、高级工具与扩展

1.4.1. 符号处理工具

1.4.1.1. strip
  • 详细功能strip 用于从目标文件中去除符号表和调试信息,从而减小文件的大小。在发布软件时,通常会使用 strip 工具去除不必要的信息,以节省磁盘空间和提高加载速度。
  • 示例命令及解释
strip --strip-unneeded app

--strip-unneeded 选项表示去除所有不需要的符号信息,此命令会去除 app 可执行文件中不必要的符号信息。

1.4.1.2. c++filt
  • 详细功能c++filt 主要用于对 C++ 符号进行名称修饰(demangle)。在 C++ 中,为了支持函数重载和模板等特性,编译器会对函数名和类名进行修饰,生成复杂的符号名。c++filt 可以将这些修饰后的符号名解析为可读的形式。
  • 示例命令及解释
c++filt _ZN4Test3addEii
# 输出:Test::add(int, int)

该命令将修饰后的符号 _ZN4Test3addEii 解析为 Test::add(int, int)

1.4.2. 特殊格式处理

1.4.2.1. windmcwindres
  • 详细功能
    • windmc:用于编译 Windows 资源脚本(通常以 .rc 为扩展名)为二进制资源文件(通常以 .res 为扩展名)。
    • windres:将 .res 文件转换为目标文件(.o),以便在链接时可以被链接器使用。
  • 示例命令及解释
windmc resource.rc -r .
windres resource.res -o resource.o

windmc 命令将 resource.rc 资源脚本文件编译为 resource.res 二进制资源文件,-r 选项指定资源文件的输出目录为当前目录。windres 命令将 resource.res 资源文件转换为 resource.o 目标文件。

1.4.2.2. elfedit
  • 详细功能elfedit 可以直接编辑 ELF 文件的内容,如修改程序头、节头、符号表等信息。它适用于高级逆向工程或定制二进制文件的场景,允许开发者对 ELF 文件的结构进行精细调整。
  • 示例命令及解释
elfedit -A app  # 交互式修改

-A 选项表示打开交互式编辑器,此命令会打开一个交互式界面,允许用户对 app 可执行文件的 ELF 结构进行修改。

1.4.3. 实验性工具

1.4.3.1. gold
  • 详细功能gold 是一个实验性的链接器,作为 ld 的替代方案。它基于插件机制实现,具有更快的链接速度,支持链接时优化(LTO)和稀疏链接等特性,可以提高大型项目的链接效率。
  • 示例命令及解释
gold -o app code.o -Wl,--gc-sections

-o 选项指定输出的可执行文件名为 app-Wl 选项用于传递选项给链接器,--gc-sections 选项表示在链接时去除未使用的节,以减小文件大小。

1.4.3.2. lto-dump
  • 详细功能lto-dump 用于显示链接时优化(Link - Time Optimization, LTO)生成的中间文件(通常以 .o.lto 为扩展名)的详细信息。它可以帮助开发者了解 LTO 优化的具体过程和效果。
  • 示例命令及解释
lto-dump -v optimized.o

-v 选项表示显示详细信息,此命令会输出 optimized.o 文件在 LTO 优化过程中的详细信息。

1.5. 典型工作流程示例

1.5.1. 编译与链接

# 编译 C 代码
gcc -c -g -O2 source.c -o source.o
# -c 选项表示只编译不链接,-g 选项表示生成调试信息,-O2 选项表示使用二级优化# 链接静态库
ld -o program source.o libmath.a
# 将 source.o 目标文件和 libmath.a 静态库链接成可执行文件 program# 生成动态库
gcc -shared -fPIC -o libutil.so util1.o util2.o
# -shared 选项表示生成共享库,-fPIC 选项表示生成位置无关代码

1.5.2. 逆向分析

# 反汇编并混合显示源代码
objdump -S program
# 前提是 program 是使用 -g 选项编译的# 查看依赖的动态库
readelf -d program | grep NEEDED
# -d 选项表示显示动态节信息,通过 grep 过滤出依赖的动态库# 提取敏感字符串
strings -t x program | grep "password"
# -t x 选项表示显示字符串的十六进制偏移地址,通过 grep 查找包含 "password" 的字符串

1.6. 总结

GNU Binutils 是开源社区的瑰宝,其工具链深度整合了编译、链接、分析、调试等功能。掌握这些工具的组合使用,可显著提升软件开发效率,尤其在逆向工程、性能优化和二进制审计中发挥关键作用。建议开发者结合 man 手册和实际项目深入实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker python:latest镜像 允许ssh远程

跳转到家目录 cd创建pythonsshdockerfile mkdir pythonsshdockerfile跳转pythonsshdockerfile cd pythonsshdockerfile创建Dockerfile文件 vim Dockerfile将Dockerfile的指令复制到文件中 # 使用 python:latest 作为基础镜像 # 如果我的镜像列表中没有python:latest镜像&…

c++的基础排序算法

一、快速排序 1. 选择基准值(Pivot) 作用 :从数组中选择一个元素作为基准(Pivot),用于划分数组。常见选择方式 : 固定选择最后一个元素(如示例代码)。随机选择&#xf…

jmeter分布式原理及实例

一、执行原理 二、相关注意事项 关闭防火墙所有上网控制机、代理机、服务器都在同一个网络上所有机器的jmeter和java版本必须一致关闭RMI.SSL开关 三、配置和执行 配置: 修改bin/jmeter.properties文件: 代理机: 修改服务端口&#xff1…

LinuX---Shell脚本创建和执行

概述: 它是一个命令行解释器,接收应用程序/用户命令,然后调用操作系统内核。 Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。 Linux提供的Shell解析器有 atguiguubuntu:~$ cat /etc/shells # /etc/shells: valid …

FPGA中级项目1——IP核(ROM 与 RAM)

FPGA中级项目1——IP核(ROM 与 RAM) IP核简介 在 FPGA(现场可编程门阵列)设计中,IP 核(Intellectual Property Core,知识产权核)是预先设计好的、可重用的电路模块,用于实…

第九节:哈希表(初阶)

1. 哈希表的核心概念 哈希表(Hash Table)是一种通过哈希函数将键(Key)映射到存储桶(Bucket)的数据结构,核心目标是实现快速查找、插入和删除操作。其核心特点如下: ​哈希函数&…

缓存使用的具体场景有哪些?缓存的一致性问题如何解决?缓存使用常见问题有哪些?

缓存使用场景、一致性及常见问题解析 一、缓存的核心使用场景 1. 高频读、低频写场景 典型场景:商品详情页、新闻资讯、用户基本信息。特点:数据更新频率低,但访问量极高。策略: Cache-Aside(旁路缓存)&a…

谷歌 Gemini 2.0 Flash实测:1条指令自动出图+配故事!

今天看到很多人夸Gemini 2.0 Flash的能力很强。 强大的P图能力,改背景、换衣服、调整姿态、表情控制等等 其中最让人眼前一亮的是图文功能。 它不仅是理解图文,而是能根据文字描述创作出一整个的故事、步骤图文。 我上手试了一下,感觉效果…

雷电模拟器连接Android Studio步骤

打开雷电模拟器,点击桌面系统应用—>打开设置—>关于平板电脑→连续点击5次版本号,会出现开发者选项—->进入开发者选项—->勾选打开usb调试。 命令行提示符,进入雷电模拟器安装目录。然后执行 Plain Text adb.exe connect 127.0…

配置普通链接二维码规则 校验文件检查失败

配置普通链接二维码规则 校验文件检查失败 1.问题 2.解决思路: 直接访问地址,不跳转文本,感觉是nginx配置问题打开服务器nginx 域名默认走80端口,配置了指定的访问路径,命令行 nginx -t ,nginx -s reload,start ngin…

c语言经典基础编程题

c语言经典基础编程题 一、输出输出1.1温度输出1.2排齐数据1.3进制转换 二、选择分支2.1求最大值2.2成绩评定2.3分段函数求值2.4 利润计算2.5判断闰年2.6二次方程根 三、循环结构3.1倒数求和3.2最大数3.3判断素数3.4判断完全数3.5打印菱形🚀🚀&#x1f68…

安全的实现数据备份和恢复

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

OpenMCU(三):STM32F103 FreeRTOS移植

概述 本文主要描述了STM32F103移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_RTOS这个工程,该工程已经下载放好了移植STM32F103 FreeRTOS的所有文件 OpenMCU_RTOS工程的愿景…

生成对抗网络(GAN)原理与应用

目录 一、引言 二、GAN的基本原理 (一)生成器(Generator)的工作机制 (二)判别器(Discriminator)的工作机制 (三)对抗训练的过程 三、GAN在AIGC生图中的应…

STM32 内置的通讯协议

数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接,异步是没时钟连接,靠约定号的频率(波特率)接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的,一般用不到…

Appium等待机制--强制等待、隐式等待、显式等待

书接上回,Appium高级操作--其他操作-CSDN博客文章浏览阅读182次,点赞6次,收藏7次。书接上回Appium高级操作--从源码角度解析--模拟复杂手势操作-CSDN博客。https://blog.csdn.net/fantasy_4/article/details/146162851主要讲解了Appium的一些…

NFS实验配置笔记

NFS NFS服务 nfs,最早是Sun这家公司所发展出来的,它最大的功能就是可以透过网络,让不同的机器,不同的操作系统,进行实现文档的共享。所以你可以简单的将他看做是文件服务器。 实验准备 ①先准备一个服务器端的操作…

深度学习|MAE技术全景图:自监督学习的“掩码魔法“如何重塑AI基础

一、引言:深度学习的困境与自监督的曙光 深度学习(Deep Learning)无疑是当今人工智能领域基础中的基础。从图像识别到自然语言处理(NLP),它在无数任务中展现了卓越性能。例如,在安防监控中&…

【SpringBoot】实现登录功能

在上一篇博客中,我们讲解了注册页面的实现。在此基础上会跳转到登录页面,今天给大家带来的是使用 SpringBoot,MyBatis,Html,CSS,JavaScript,前后端交互实现一个登录功能。 目录 一、效果 二、…

mingw工具源码编译

ming-w64 mingw编译生成的库,需要mingw的lib文件支持。 https://github.com/mingw-w64/mingw-w64 使用msys2的bash git checkout v8.0.3 ./configure --disable-dependency-tracking --targetx86_64-w64-mingw32 mingw32-make.exe -j4 修改makefile中的make 改成mi…