Linux下Ghidra 11.0.2配置与无头模式批量反编译实践
简介Ghidra 11.0.2 是适用于 Linux 环境的软件逆向工程SRE框架内置反汇编、反编译、脚本执行与插件扩展等完整工具链适合安全分析、漏洞研究、恶意代码分析及 CTF 逆向等场景。压缩包内共包含 2000 个文件以 Python/Java 脚本为主覆盖分析器、反编译器、数据可视化与自动化辅助工具同时包括 C/C 源码、处理器模块、XML/Properties 配置、TXT/Markdown 说明文档和 HTML 帮助页面整体约 393.79MB目录结构完整便于按功能模块检索学习。目前已有 2773 人学习/下载。Ghidra 内置的完整功能组件与扩展生态支持多种处理器指令集与可执行格式可在用户交互和自动双模式下运行并通过公开 API 继续扩展插件。借助官方/社区脚本、底层 C/C 源码及说明文档既能支撑实际二进制分析项目也能深入学习反汇编、反编译原理。1. 把 Ghidra 11.0.2 装进 Linux从下载到批处理只差一个 JDK 21闭源二进制对逆向工程师就是个黑匣子尤其是拿到手时只有 ELF 头、没有符号表的 Linux 程序。Ghidra 11.0.2 是少数能在纯命令行服务器上跑批处理的逆向工作台反编译质量接近商业工具而且自带无头模式Headless不占桌面环境就能完成批量导入、分析和导出。下面我按自己的使用路径来写先把 JDK 21 这个前置条件解决再把内存参数和分析选项调对接着用 analyzeHeadless 跑批处理脚本最后列出几个我在 Linux 上翻过车的典型问题。新手照着复现即可熟手可以直接跳到第 3 章看脚本。2. 启动前的那几步JDK 21 检查、launch.properties 与首次 GUI 导入2.1 为什么是 JDK 21 而不是 17先用两条命令自检Ghidra 10.x 时代用 JDK 17 还能跑但从 11.0 系列开始官方包直接要求 JDK 21。我印象很深的一次是某台服务器上默认 java 还是 11启动脚本报了一行 unsupported class file version排了半天才意识到是版本错位。所以拿到 ghidra_11.0.2_PUBLIC 发行包解压前先确认当前默认 JDKjava -version update-alternatives --list java readlink -f $(which javac)第一行看运行时版本第二行列出系统里注册过的 JDK第三行确认 javac 实际指向哪个安装目录。三个命令输出版本一致再往下走。如果 java -version 显示的是 17 或更低主流发行版的软件仓库里一般都有 OpenJDK 21装完后用 update-alternatives --config java 切到新版本再重新登录终端让环境变量刷新。只切 javac 不切 java 是这里最常见的坑。有些发行版把 JAVA_HOME 写死在全局配置文件里切换默认 java 后没有导出新的 JAVA_HOMEGhidra 的启动脚本依然会找到旧版本。我习惯在 ~/.bashrc 里加一行 export JAVA_HOME/opt/jdk-21再用软链接管理版本避免系统升级时把默认 JDK 悄悄换掉。容器场景下 update-alternatives 不适用我会在镜像构建阶段直接用 ENV JAVA_HOME 指向 JDK 21 目录并确认 PATH 里没有残留旧版本。注意Ghidra 启动脚本优先读 JAVA_HOME所以 java 和 JAVA_HOME 两个位置都要对缺一个就会回到老版本上。2.2 解压布局与 launch.properties把内存上限调对再跑发布包解开后布局不复杂重点看三个地方根目录的 ghidraRun、support 目录里的 analyzeHeadless 和 launch.properties。很多人直接把 ghidraRun 双击启动就开始分析结果在几百 MB 的固件面前被默认堆内存卡死。先看布局unzip ghidra_11.0.2_PUBLIC_*.zip -d /opt cd /opt/ghidra_11.0.2_PUBLIC grep -n VMARGS support/launch.propertieslaunch.properties 里的 VMARGS 是 JVM 参数入口默认值对小型二进制够用但不适合固件和内核映像。我一般改成 -Xmx8G再根据机器内存留余量如果机器只有 16G 内存我给 8G而不是全压上去。另一个更灵活的改法是启动前用环境变量追加export GHIDRA_VMARGS_OPTIONS-Xmx8G -XX:MaxDirectMemorySize4GGHIDRA_VMARGS_OPTIONS 会追加到 launch.properties 的组合参数里适合 CI 或临时分析任务。注意堆内存与直接内存要同时调Decompiler 有一部分内存分配发生在原生堆只调 -Xmx 不够。内存不是唯一瓶颈。每次分析都会启动多个线程在虚拟机里开太多线程会拖慢整体进度图形界面可以在 Analysis Options 里减少并行度无头模式用 -max-cpu 控制这个参数到第 3 章细说。修改 launch.properties 前记得备份原始文件或者把原值注释掉这样升级版本时还能对照默认参数。2.3 首次启动与导入自动识别语言与两类关键分析选项终端里执行 ./ghidraRun首次启动会要求指定项目目录。我建议单独建一个 ghidata 目录不要放在 home 根目录否则备份时会把几个 GB 的缓存一起带走。首次导入 ELF 时Ghidra 会根据魔数和机器类型自动选择语言Language例如 x86:LE:64:default 或 AARCH64:LE:v8A。点 OK 后弹出的分析选项面板是关键。我每次必勾两类Reference 补全交叉引用Decompiler Parameter ID 修复函数签名。对 stripped 程序我还会把 Decompiler 参数分析里的调用约定修复一并打开。这些选项会让分析时间变长但函数级反编译质量高出一截。新手不要一次把所有分析选项全部勾上先跑默认缺什么引用再补什么否则一个几十 MB 的文件要等很久。这里顺带回答一个高频问题汉化版。我拆过一个汉化整合包原理是往 Extensions 目录塞翻译资源 jar并在启动脚本加语言参数。如果你用的是汉化版注意语言资源与 Ghidra 11.0.2 版本严格绑定拷错版本就会出现菜单缺项、快捷键丢失这类小毛病。官方包想变中文界面也可以挂社区语言扩展但我建议保留官方原包升级时删掉语言 jar 换新的不要散放 class 文件覆盖官方资源。Ghidra 项目目录里会生成 .rep 后缀的数据库文件真正分析缓存则在 ~/.ghidra 下。某次重启后项目列表读不出来多半是缓存目录被清理或权限变了先看 .rep 目录是否完整再检查 ~/.ghidra 权限不要急着重新导入分析。3. 无头模式批量反编译analyzeHeadless 参数解析与函数级导出脚本3.1 五个高频参数先看表格再拼命令Ghidra 图形界面适合交互式分析但真正拉开效率差距的是 headless 批处理。support/analyzeHeadless 能在不启动 CodeBrowser 的情况下完成导入、分析、脚本执行和导出给 CI 用比 GUI 稳定得多。先把最常用的参数列出来参数作用常用值-import导入文件或目录可多次传入/path/to/bin、dir/-process处理项目里已有的程序配合 -import 使用项目内程序名-overwrite存在相同分析对象时强制重新导入无-scriptPath指定 GhidraScript 搜索路径./scripts-postScript分析完成后执行脚本export_functions.py-postScriptArg传给脚本的参数keyvalue-analysisTimeoutPerFile单个文件分析超时秒120-max-cpu限制分析使用的核数4-deleteProject跑完删除临时项目无如果你只是要把一个文件导进已有项目再单独跑一轮脚本那就不加 -import改用 -process 加项目内程序名。我最早就是从 GUI 建好项目后在命令行用 -process 重跑脚本省掉重复导入。注意 -process 后面跟的是项目里的程序名不是原始文件路径。批量处理时项目路径不存在会自动创建同名项目会报错所以批处理场景我习惯加 -deleteProject跑完即删不占磁盘。第一次试脚本时建议只处理单个文件确认输出没问题再加目录批量避免导入上千个文件后才发现脚本里 import 写错。还要理解 headless 对单个文件的处理顺序先 import再自动分析最后执行 postScript。判断超时发生在哪一段时就看日志里阶段标记的位置。 import 阶段卡住通常是文件格式识别问题分析阶段卡住多半是内存或超时设置postScript 阶段卡住则优先查 Jython 语法和脚本路径。3.2 Jython 脚本导出函数级 C遍历函数与 DecompInterfaceanalyzeHeadless 的 -postScript 执行时脚本跑在 Ghidra 的脚本环境里Java 脚本和 Python 脚本Jython 2.7都行。我用 Jython 偏多因为可以直接拿函数表并灵活写 JSON。下面这个脚本会遍历全部函数输出每个函数名对应的反编译 C 代码# export_functions.py —— 把全部函数伪代码导出为 JSON import json from ghidra.app.decompiler import DecompInterface from ghidra.util.task import ConsoleTaskMonitor # GhidraScript 环境里 program 就是当前被分析程序 program getCurrentProgram() decomp DecompInterface() decomp.openProgram(program) monitor ConsoleTaskMonitor() out {} funcs program.getFunctionManager().getFunctions(True) for func in funcs: # 第二参数是单函数反编译超时秒数 res decomp.decompileFunction(func, 60, monitor) if res is not None and res.decompileCompleted(): out[func.name] res.getDecompiledFunction().getC() with open(/tmp/ghidra_export/functions.json, w) as f: json.dump(out, f, indent2) print(exported %d functions % len(out))逻辑说明getFunctionManager().getFunctions(True) 拿到全部函数DecompInterface.openProgram 只需要调用一次decompileFunction 的第二个参数是单函数超时秒数遇到跳转特别多的函数时60 秒足够判断是否卡死res.getDecompiledFunction().getC() 拿到的就是图形界面里的伪代码字符串。最后把函数名和伪代码一起落地为 JSON方便后续按名字过滤。参数上有几个容易忽略的点JSON 输出里的函数名不是全局唯一不同命名空间下会重名我会在导出后再套一层地址前缀。另一个老问题Jython 2.7 不支持 f-string也不支持 pathlib 那套把 Python 3 脚本直接丢进 Ghidra 会在解析阶段报错print 语句也要带括号。写脚本前先确认语法兼容性这是血泪经验。如果脚本需要接收外部参数用 getScriptArgs() 读取命令行里 -postScriptArg 传入的值。比如我只想导出某个前缀的函数可以在命令行传 only_prefixsub_脚本内部做一次字符串过滤这样同一个脚本可以复用到不同目标的批次。如果只是想导出一个扁平 C 文件图形界面的 File Export Program 里也有 C/C 导出选项无头模式下我还是用上面的脚本因为能完整保留函数名、地址映射和超时保护外部工具处理起来更方便。3.3 服务器批量运行的三个习惯超时、并行与磁盘清理跑大批量前我固定做三件事限制单文件超时、限制 CPU 核数、把临时项目删干净。否则一个坏样本就能卡住整个批次或者 16 核服务器被分析进程占满导致其他服务不可用。for bin in $(find samples -type f -name *.so); do support/analyzeHeadless /tmp/proj tmp \ -import $bin -scriptPath scripts -postScript export_functions.py \ -analysisTimeoutPerFile 120 -max-cpu 4 \ -deleteProject -log /tmp/logs/$(basename $bin).log done这里刻意每个文件建一次临时项目避免同一个项目里混入多种架构导致语言解析相互干扰。-analysisTimeoutPerFile 120 表示超时文件直接跳过-max-cpu 4 限制同时使用的核数-log 把每个文件的完整日志拆开出错时定位更快。注意-deleteProject 会把整个临时项目删掉脚本输出路径一定要放在项目目录之外否则结果跟着一起被清掉。如果跑完没看到 JSON先看脚本路径是否写对再看 Jython 是否有语法错误最后检查 stdout 里的 print 输出。脚本本身的异常不会让 analyzeHeadless 崩溃但它会记录到日志里所以不要只看有没有生成文件也要扫一眼日志里的 Exception 关键字。批处理结束后我习惯把所有 JSON 合并成一个大文件再做下一步过滤。合并这种活不放进 Ghidra用外部脚本处理更轻。这样分析管线和数据处理完全解耦后面换版本、换脚本都不会互相影响。4. Linux 下的避坑记录从 JDK 炸裂到汉化不生效下面四条是血泪经验按「现象 → 原因 → 解决」的顺序写遇到可以直接对照。4.1 启动脚本报 UnsupportedClassVersionError现象运行 ./ghidraRun 或 support/analyzeHeadless控制台出现 UnsupportedClassVersionError或提示 Failed to find a supported JDK。原因系统默认 JDK 低于 21部分发行版同时装多个 JDK启动脚本取到的是旧版本。容器镜像里只装 JRE 17 也会这样。解决执行 update-alternatives --config java 切到 JDK 21同时把 JAVA_HOME 写进 ~/.bashrc。如果不想每次肉眼检查我在启动脚本前加一段硬校验if ! java -version 21 | grep -q version 21; then echo need JDK 21 2 exit 1 fi判断条件匹配的是version 21开头的字符串21.0.x 都能通过不会误伤小版本。这个检查虽然只有三行但能省掉大半启动失败的手动排查时间。还有一种容易被忽略的情况IDE 自带内嵌 JDK命令行里 java -version 正常但 IDE 的终端里 PATH 被改写导致 Ghidra 启动时拿到内嵌 JDK。遇到这种就统一用系统 JDK别让两个 JDK 同时出现在 PATH 里。4.2 大文件分析中途 OutOfMemoryError现象分析 300MB 固件时进度条卡在某个函数附近随后进程消失或 GUI 崩溃。原因默认 VMARGS 偏小Decompiler 对跳转特别多的函数内存消耗会突然翻倍。同类型崩溃在分析内核 vmlinux 时最容易出现。解决修改 support/launch.properties 的 VMARGS或用环境变量追加。我常用这一行export GHIDRA_VMARGS_OPTIONS-Xmx8G -XX:MaxDirectMemorySize4G support/analyzeHeadless /tmp/proj tmp -import firmware.bin -scriptPath scripts -postScript export_functions.py-Xmx8G 给堆MaxDirectMemorySize 给直接内存两者都要调。如果机器只有 16G 内存还要跑别的任务就给 8G 再加 -max-cpu 4别把系统内存占满。一边开着浏览器一边分析大的内核镜像是典型的翻车姿势。遇到崩溃后不要盲目加大内存先看是被哪个函数卡住有的函数明显是反编译器把内联展开得过大这种可以直接跳过或者单独设置更短超时。4.3 无显示服务器上裸跑 GUI 报 HeadlessException现象在只有 ssh 的服务器上执行 ./ghidraRun报 java.awt.HeadlessException。原因GUI 启动需要 X Display开发机没插显示器也会触发同样的问题。解决日常分析直接用 analyzeHeadless确实要看界面就加 ssh -X 或 xvfb-runxvfb-run -a ./ghidraRunxvfb-run -a 会临时起一个虚拟显示适合做启动可用性检查。ssh -X 转发在部分配置下会被禁用而且界面渲染会很卡不适合做大工程操作。服务器上跑 GUI 还要注意字体包缺少字体时菜单文字会变成方块看到那种情况先补字体再回来怀疑 Ghidra 配置。无头模式才是服务器上的正路。4.4 汉化版装了但菜单还是英文或缺项现象下载了标着 11.0.2 的汉化整合包打开后菜单栏仍是英文甚至插件列表里出现两个同名插件。原因语言 jar 版本与 Ghidra 版本不匹配或启动脚本里的语言参数没生效。解决先看启动脚本是否真的带 -Duser.languagezh再核对汉化 jar 版本。我习惯官方包不动汉化 jar 放 Extensions 目录升级时删旧 jar 换新的。有些整合包把翻译资源散放成 class 文件直接覆盖官方资源这种最容易出现菜单丢一半、对话框空白的问题我不会往这个方向改。验证是否生效最快的方式是用项目导出功能对比菜单项不用重新分析二进制。5. 给反编译结果验验货重编译 diff 与字符串引用定位5.1 为什么需要验货反编译器也有美化倾向反编译结果看起来逻辑通顺不代表和真实执行路径一致。我拆模拟项目X时遇到过伪代码干净得像手工重写但落到具体地址却对不上的情况。验证不是玄学是批处理流程的一部分。5.2 三步快检objdump 对照、重编译 diff、字符串定位第一步用 objdump -d 截取目标函数的汇编与反编译结果里的语句数量做粗略对比。第二步是把导出的 C 伪代码用交叉编译器重新编译成 object统计控制流指令数量aarch64-linux-gnu-gcc -O0 -c export.c -o recompiled.o objdump -d recompiled.o | grep -E call|bl|b | wc -l objdump -d original_binary | grep -E call|bl|b | wc -l-O0 故意不开优化因为反编译伪代码本身不保留编译器优化流水线数量差在 30% 以内整体结构大概率对得上差得离谱就要回头重看那个函数的汇编。第三步是字符串引用定位。在伪代码里找一个特征字符串比如错误日志去原二进制的 .rodata 段找对应地址再用交叉引用反查哪个函数引用它。这个方法能快速确认没有认错函数。如果你正打算在 Linux 上用这个版本把 11.0.2 的发行包下载到本机先花十分钟做掉第 4 章那四类检查再跑第 3 章的批处理脚本基本就能把坑避掉一大半。从那以后我每次跑完无头批处理都强制走一遍「重编译 diff 字符串引用」两步检查五分钟就能发现大半反编译美化带来的翻车点。它不能证明结果绝对正确但能让你在排错时少一点「这里怎么这么干净」的怀疑。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

CFF_Explorer实战:拆解PE结构,看懂导入导出表和重定位

CFF_Explorer实战:拆解PE结构,看懂导入导出表和重定位

简介:面向逆向工程师、安全研究人员及Windows程序开发者的PE文件分析工具包,以CFF_Explorer主程序为核心,配套CFF扩展开发文档、脚本语言说明、签名技术细节等PDF资料,并附4GBPatch、ITReport等CFF脚本与SDK扩展安装程序&#xff…

2026/10/9 15:17:52 阅读更多 →
Discovery软件安装部署全指南:模块选型、License配置与避坑实战

Discovery软件安装部署全指南:模块选型、License配置与避坑实战

简介:这份PPT围绕石油行业Discovery油藏描述平台的软件介绍与安装展开,面向地质学家、测井工程师和地震解释人员,帮助他们快速建立对数据管理、地震解释、测井研究及地质分析一体化工作流的整体认知。包内仅含1个pptx演示文档,压缩…

2026/10/9 15:16:51 阅读更多 →
VS2005与Access老项目实战:连接配置、数据访问与避坑指南

VS2005与Access老项目实战:连接配置、数据访问与避坑指南

简介:针对C#初学者和希望快速上手Access数据库开发的读者,配套光盘中收录了VS2005环境下使用C#操作Access数据库的经典案例。内容围绕连接配置、数据增删改查、列表绑定与统计查询等典型场景展开,可帮助学习者从零搭建一个完整可运行的示例&a…

2026/10/9 15:16:51 阅读更多 →

最新新闻

如何降低大模型 Token 调用成本?2026 年模型分级、缓存、路由和提示词优化清单(TaoToken 统一 Key 实践版)

如何降低大模型 Token 调用成本?2026 年模型分级、缓存、路由和提示词优化清单(TaoToken 统一 Key 实践版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
【Bug已解决】codex: 沙箱阻止操作 — CodeX CLI 无法在沙箱中执行命令解决方案(TaoToken 统一 Key 通道版)

【Bug已解决】codex: 沙箱阻止操作 — CodeX CLI 无法在沙箱中执行命令解决方案(TaoToken 统一 Key 通道版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
通过定制SimpleCursorAdapter来实现ListView:把Cursor字段映射改到TaoToken统一Key通道的配置与验证

通过定制SimpleCursorAdapter来实现ListView:把Cursor字段映射改到TaoToken统一Key通道的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
Linux进程状态详解:从R/S/D/T/Z到线上故障排查实战

Linux进程状态详解:从R/S/D/T/Z到线上故障排查实战

做运维这些年,几乎每次面试都会拿“Linux进程状态有哪些”当开场题,而每次都能筛掉一批人。上周我带的一个徒弟出去面试,倒是把R、S、D、T、Z、X背得滚瓜烂熟,结果被追问“D状态到底意味着什么、线上遇到怎么处理”就卡壳了。其实…

2026/10/9 15:52:43 阅读更多 →
英特尔 oneAPI 工具包:用 DPC++ 打开异构计算新纪元

英特尔 oneAPI 工具包:用 DPC++ 打开异构计算新纪元

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:52:43 阅读更多 →
STGCN时空图卷积网络详解:从原理到PyTorch交通流量预测实践

STGCN时空图卷积网络详解:从原理到PyTorch交通流量预测实践

简介:这套PyTorch框架下的STGCN时空图卷积网络实现,源自IJCAI 2018论文官方代码,面向从事人体行为分析、智能监控与动作识别研究的开发者和学习者。模型通过图卷积模块提取骨骼关节点拓扑特征,结合时序卷积层捕捉动作序列动态变化…

2026/10/9 15:51:41 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →