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

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

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 手册和实际项目深入实践。

相关文章:

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

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(…...

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...

[QT]开发全解析:从概念到实战

文章目录 Qt 框架入门与应用开发指南一、Qt 框架概述1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt 的应用场景1.7 Qt 的成功案例 二、Qt 的开发工具概述Qt CreatorVisual StudioEclipse 三、认识 Qt Creator3.1 Qt Creator 概览3.2 使用 Qt C…...

进程控制 ─── linux第15课

目录 进程控制 1.进程创建 (fork前面讲过了) 写时拷贝 进程终止 进程退出场景 退出码 进程终止方法 进程控制 1.进程创建 (fork前面讲过了) 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父…...

uniapp:小程序将base64图片字符串保存到手机相册

一、需求分析 用户提供的是Base64格式的图片数据,而小程序保存图片到本地通常需要的是临时文件路径。 第一步可能需要将Base64数据转换成临时文件,然后再保存到手机相册。 第二步查阅UniApp的文档,关于保存图片到相册的相关API,…...

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日,机器人行业龙头宇树科技(Unitree)在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司,聚焦智能机器人研发与销售,标志着宇树科技在华南市场的战…...

个推助力小米米家全场景智能生活体验再升级

当AI如同水电煤一般融入日常,万物互联的图景正从想象照进现实。作为智能家居领域的领跑者,小米米家凭借开放的生态战略,已连接了超8.6亿台设备,构建起全球领先的消费级AIoT平台。如今,小米米家携手个推,通过…...

四款GIS工具箱软件解析:满足企业多样化空间数据需求

概述 随着地理信息系统(GIS)在城市规划、环境监测、资源管理等领域的广泛应用,各种GIS工具箱软件不断涌现,为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件,这些软件各具特色…...

Deepseek×ComfyUI革命性工作流:AI图像3倍速精修实战指南

一、为什么选择深度优化的AI精修方案(H2) 核心关键词:AI图像优化工作流、ComfyUI加速方案、Deepseek节点配置 ▸ 传统Stable Diffusion耗时痛点分析(渲染时间/显存占用) ▸ 深度神经网络的并行计算优势对比&#xff…...

IntelliJ IDEA 2024.3.4 版本无法正常加载maven项目

报错如下: Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://192.168.22.76:9003/repository/thirdparty/ - Check that Maven pom files do not co…...

为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper

为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper 1. HttpServletRequest 不可直接修改2. 能够修改请求参数和请求体3. 方便扩展与重用4. 处理请求参数和请求体5. 避免对原始请求做修改 典型使用场景举个例子总结 在 Java Web 开发中,过滤器&…...

SpaCy处理NLP的详细工作原理及工作原理框图

spaCy处理NLP的详细工作原理及工作原理框图 spaCy处理NLP的详细工作原理 spaCy是一个基于Python的开源自然语言处理(NLP)库,它提供了一系列高效且易用的工具,用于执行各种NLP任务,如文本预处理、文本解析、命名实体识…...

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的,Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛,常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 Matlab将数值分析、矩阵计算、科学…...

OCPP与ISO 15118集成:实现即插即充与车网互动(V2G)- 慧知开源充电桩平台

OCPP与ISO 15118集成:实现即插即充与车网互动(V2G) 引言 随着电动汽车(EV)与电网双向能量交互(V2G)技术的成熟,OCPP协议与ISO 15118标准的协同成为智能充电基础设施的核心挑战。本文…...

【C++设计模式】第七篇:桥接模式(Bridge)

注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 抽象与实现的解耦之道 1. 模式定义与用途​​ 核心思想​ ​桥接模式:将抽象部分与实现部分分离,使二者可以独立变化。​关键用途: ​1.拆分复杂继承…...

【SA8155】AIS Camera流程简述

目录 1 AIS Camera流程之初始化 2 AIS Camera流程之opencamera 3 AIS Camera流程之request处理流程 高通QNX车载系统 + LA虚拟机下Camera框图如下: 高通车载系统中,如上述框图所述,模组驱动在QNX侧,Android侧需要通过HAB Socket通信获取相机的数据。ais_v4l2_proxy将获取…...

容器 /dev/shm 泄漏学习

容器 /dev/shm 泄漏的介绍 在容器环境中,/dev/shm 是一个基于 tmpfs 的共享内存文件系统,通常用于进程间通信(IPC)和临时数据存储。由于其内存特性,/dev/shm 的大小是有限的,默认情况下 Docker 容器的 /de…...

【Deepseek基础】--3.版本对比

目录 1.Deepseek-v1:起步与编码强劲 2. DeepSeek-V2:性能提升与开源生态 3.DeepSeek-V2.5系列:数学与网络搜索突破 4.DeepSeek-R1-Lite系列:推理模型预览版上线 5. DeepSeek-V3系列:大规模模型与推理速度提升 6…...

一周学会Flask3 Python Web开发-WTForms表单验证

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们可以通过WTForms表单类属性的validators属性来实现表单验证。 常用的WTForms验证器 验证器说明DataRequired(messageNo…...

算法题笔记(自用)——Python

目录 一. 进制&位运算&ASCAII 二. format格式化输出 1. 基本用法 2. 位置参数 3. 格式化数字 4. 对齐和填充 5. 格式化二进制、八进制、十六进制 6. 格式化百分比 7. 格式化科学计数法 8. 格式化字符串字面量(f-string) 三. 字符串 使…...

Fiji图像处理

文章目录 一、Fiji —— 基于 imageJ 的免费且开源的图像处理软件1.1、工具安装(免费)1.2、源码下载(免费) 二、功能详解2.0、Fiji - ImageJ(Web应用程序)2.1、常用功能(汇总)2.2、F…...

【数据结构】堆和priority_queue

堆的定义 堆是什么?实际上堆是一种特殊的(受限制的)完全二叉树,它在完全二叉树的基础上要求每一个节点都要大于等于或者小于等于它的子树的所有节点。这个大于小于体现在节点的值或者权重。 如图所示: 根节点大于等于…...

Vue的简单入门 三

目录 侦听器 watch 注意 表单输入绑定 v-model v-model修饰符​编辑 lazy number Trim 模板引用 组件组成 组件引用三步走 组件的嵌套关系 header Main Aside Aritice Item App.vue组件引入三个子组件 组件的注册方式 全局注册组件的方法 (1) Vue 2 语…...

kotlin的val声明的变量是常量吗

kotlin的val声明的变量是常量吗 DeepSeek R1 思考 65 秒 思考过程 嗯,用户问的是Kotlin中的val声明的变量是不是常量。首先我需要回忆一下Kotlin的基础知识。记得在Kotlin里,val用来声明只读变量,也就是说一旦赋值之后就不能再重新赋值了。…...

C# | 委托 | 事件 | 异步

委托(Delegate)和事件(Event) 在C#和C中,委托(Delegate)与事件(Event)以及函数对象(Function Object)是实现回调机制或传递行为的重要工具。虽然…...

算法日记33:14届蓝桥C++B冶炼金属(二分答案)

一、题目&#xff1a; 二、题解&#xff1a; 1、思路解析&#xff1a; 1&#xff09;首先我们可以发现题目的样例数量为&#xff08; n < 1000 n<1000 n<1000&#xff09;&#xff0c;因此我们可以考虑 O ( n ∗ l o g n ) O(n*log^n) O(n∗logn)时间复杂度的算法 …...

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH

【YOLO V5】目标检测 WSL2 AutoDL VScode SSH 前言整体思路理解向YOLO 目标检测完整流程 环境配置Anaconda 获取 YOLO 代码与预训练模型下载 YOLOv5 代码和预训练模型配置 YOLOV5 工程环境解压 YOLOv5 源代码 并 添加预训练模型调整依赖版本选择对应的 Python 解释器 数据集准备…...

前端基础之ajax

vue-cli配置代理服务器解决跨域问题 我们可以使用一个代理服务器8080&#xff0c;Vue项目8080发送请求向代理服务器8080发送请求&#xff0c;再由在理服务器转发给后端服务器 首先需要在vue.config.js中配置代理服务器 const { defineConfig } require(vue/cli-service) modul…...

vscode离线配置远程服务器

目录 一、前提 二、方法 2.1 查看vscode的commit_id 2.2 下载linux服务器安装包 2.3 安装包上传到远程服务器&#xff0c;并进行文件解压缩 三、常见错误 Failed to set up socket for dynamic port forward to remote port&#xff08;vscode报错解决方法&#xff09;-C…...

C语言——string.h下的特殊库函数

string.h下的特殊函数 strtok(分割字符串&#xff09;strerror(错误码信息&#xff09;memcpy(拷贝&#xff09;memmove(拷贝&#xff09;memset(设置内存&#xff09;memcmp(比较大小&#xff09; strtok(分割字符串&#xff09; char * strtok ( char * str, const char * s…...

烟花燃放安全管控:智能分析网关V4烟火检测技术保障安全

一、方案背景 在中国诸多传统节日的缤纷画卷中&#xff0c;烟花盛放、烧纸祭祀承载着人们的深厚情感。一方面&#xff0c;烟花璀璨&#xff0c;是对节日欢庆氛围的热烈烘托&#xff0c;寄托着大家对美好生活的向往与期许&#xff1b;另一方面&#xff0c;袅袅青烟、点点烛光&a…...

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域&#xff0c;字典序&#xff08;Lexicographical order&#xff09;也称为词典序、字典顺序、字母序&#xff0c;是一种对序列元素进行排序的方式&#xff0c;它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序&#xff1a; …...

二、Java-封装playwright UI自动化(根据官网执行步骤,首先封装BrowserFactory枚举类及BrowserManager)

前言 查看playwright官网&#xff0c;api文档了解到&#xff0c;playwright的基本步骤&#xff1a; 1、实例化一个playwright 2、启动一个浏览器类型 3、打开一个页面 所以&#xff0c;在封装时需要有一个浏览器工厂类&#xff0c;定义不同的浏览器类型&#xff0c;在配置文…...

java项目之基于ssm的在线视频网站开发(源码+文档)

项目简介 基于ssm的在线视频网站开发实现了以下功能&#xff1a; 该系统的目标用户包括管理员&#xff0c;用户。管理员上传视频&#xff0c;管理视频&#xff0c;查看视频留言&#xff0c;回复视频留言&#xff0c;管理视频收藏信息&#xff0c;管理公告&#xff0c;管理用户…...

观察者模式的C++实现示例

核心思想 观察者模式是一种行为型设计模式&#xff0c;定义了对象之间的一对多依赖关系。当一个对象&#xff08;称为Subject&#xff0c;主题&#xff09;的状态发生改变时&#xff0c;所有依赖于它的对象&#xff08;称为Observer&#xff0c;观察者&#xff09;都会自动收到…...

c语言中的主要知识点

一、基础语法与结构 程序结构 包含顺序结构、选择结构&#xff08;if/switch&#xff09;、循环结构&#xff08;for/while/do-while&#xff09;。 程序必须包含且仅有一个main函数作为入口。 数据类型与变量 基本类型&#xff1a;整型&#xff08;int、long&#xff09;、浮…...

Pytorch构建LeNet进行MNIST识别 #自用

LeNet是一种经典的卷积神经网络&#xff08;CNN&#xff09;结构&#xff0c;由Yann LeCun等人在1998年提出&#xff0c;主要用于手写数字识别&#xff08;如MNIST数据集&#xff09;。作为最早的实用化卷积神经网络&#xff0c;LeNet为现代深度学习模型奠定了基础&#xff0c;…...

docker:Dockerfile案例之自定义centos7镜像

1 案例需求 自定义centos7镜像。要求&#xff1a; 默认登录路径为 /usr可以使用vim 2 实施步骤 编写dockerfile脚本 vim centos_dockerfile 内容如下&#xff1a; #定义父镜像 FROM centos:7#定义作者信息 MAINTAINER handsome <handsomehandsome.com># 设置阿里云…...

post get 给后端传参数

post 方式一 &#xff1a; data: params 作为请求体&#xff08;Request Body&#xff09;传递&#xff1a; 你已经展示了这种方式&#xff0c;通过data字段直接传递一个对象或数组。这种方式通常用于传递复杂的数据结构。dowmfrom: function (params) { return request({ u…...

Linux 系统不同分类的操作命令区别

Linux 系统有多种发行版,每种发行版都有其独特的操作命令和工具。以下是一些常见的分类及其操作命令的区别: 1. 基于 Red Hat 的发行版 (RHEL, CentOS, Fedora) 1.1 包管理 安装软件包: bash复制 sudo yum install <package> 更新软件包: bash复制 sudo yum update…...

Checkpoint 模型与Stable Diffusion XL(SDXL)模型的区别

Checkpoint 模型与 Stable Diffusion XL&#xff08;SDXL&#xff09;模型 在功能、架构和应用场景上有显著区别&#xff0c;以下是主要差异的总结&#xff1a; 1. 基础架构与定位 Checkpoint 模型 是基于 Stable Diffusion 官方基础模型&#xff08;如 SD 1.4/1.5&#xff09;…...

软件工程与实践(第4版 新形态) 练习与实践1

软件工程与实践&#xff08;第4版 新形态&#xff09; 练习与实践1 1.填空题 (1)程序&#xff0c;文档 (2)系统软件&#xff0c;支撑软件&#xff0c;应用软件 (3)系统方法 (4)软件开发和维护 (5)工程的概念、原理、技术和方法 (6)实现软件的优质高产 (7)软件开发技术和…...

探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调

文章目录 2.8 QPSK 调制 / 解调简介QPSK 发射机的实现与原理QPSK 接收机的实现与原理QPSK 性能仿真QPSK 变体分析 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/…...

侯捷 C++ 课程学习笔记:深入理解智能指针

文章目录 每日一句正能量一、引言二、智能指针的核心概念&#xff08;一&#xff09;std::unique_ptr&#xff08;二&#xff09;std::shared_ptr&#xff08;三&#xff09;std::weak_ptr 三、学习心得四、实际应用案例五、总结 每日一句正能量 如果说幸福是一个悖论&#xff…...

基于Qwen-VL的手机智能体开发

先上Demo&#xff1a; vl_agent_demo 代码如下&#xff1a; 0 设置工作目录&#xff1a; 你的工作目录需要如下&#xff1a; 其中utils文件夹和qwenvl_agent.py均参考自 GitHub - QwenLM/Qwen2.5-VL: Qwen2.5-VL is the multimodal large language model series developed by …...

系统盘还原成正常U盘

选择格式化,等格式化完毕就完了 点击还原设备的默认值格式化就完了...

Leetcode 103: 二叉树的锯齿形层序遍历

Leetcode 103: 二叉树的锯齿形层序遍历 问题描述&#xff1a; 给定一个二叉树&#xff0c;返回其节点值的锯齿形层序遍历&#xff08;即第一层从左到右&#xff0c;第二层从右到左&#xff0c;第三层从左到右&#xff0c;依此类推&#xff09;。 适合面试的解法&#xff1a;广…...

FastGPT 引申:基于 Python 版本实现 Java 版本 RRF

文章目录 FastGPT 引申&#xff1a;基于 Python 版本实现 Java 版本 RRF函数定义使用示例 FastGPT 引申&#xff1a;基于 Python 版本实现 Java 版本 RRF 函数定义 使用 Java 实现 RRF 相关的两个函数&#xff1a;合并结果、过滤结果 import java.util.*;// 搜索结果类型定义…...

C++中的无锁编程

引言 在当今多核处理器普及的时代&#xff0c;并发编程已成为高性能应用程序开发的关键技术。传统的基于锁的同步机制虽然使用简单&#xff0c;但往往会带来性能瓶颈和死锁风险。无锁编程&#xff08;Lock-Free Programming&#xff09;作为一种先进的并发编程范式&#xff0c…...

【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现

目录 介绍 底层原理 握手环节详解&#xff1a; 收发数据&#xff08;加密&#xff09; Django 中配置 channels 1、注册 channels 2、在 settings.py 中添加 asgi_application 3、修改 asgi.py 文件 4、routing 5、consumers 实现 聊天室 介绍 WebSocket是一种先进的通信协议&…...