Clang交叉编译实战:iOS逆向中的arm64工具链配置与签名技巧
做iOS逆向的人多半都遇到过这种尴尬工具链装好了、设备连上了结果发现自己在电脑上编译出来的文件根本跑不到手机上。x86_64的Mach-O塞进arm64设备系统理都不理。于是到处搜“iOS交叉编译”折腾半天发现最有用的解法其实就是开个终端把Clang命令拼对。这期“iOS逆向篇”我就专门聊聊怎么用Clang做交叉编译把这层窗户纸捅破。我会从环境准备讲起把target triple、SDK路径、链接参数、签名这几件事串起来然后给出几个可以直接抄作业的完整例子。面向的是搞iOS安全分析、逆向、插件开发的人群也适合给iOS设备写独立工具的开发者。别怕命令行Clang交叉编译说白了就是三件事告诉编译器“编给谁看”、把SDK路径指对、最后签个名。把这三件事理顺后面就顺了。1. 为什么逆向手头要有交叉编译能力1.1 逆向过程中你会遇到的三类编译需求先说说我为什么觉得这课值得单独写一篇。iOS逆向做到中后期你不会只想在电脑上看看二进制你一定会想在真机环境里跑一点自己的东西。最常见的需求有三种。第一种是给测试设备编一个命令行小工具比如自己写的文件嗅探、内存读取、接口测试程序直接放到设备的/tmp里跑比每次都在电脑上调试方便太多。第二种是编一个动态库用注入工具把它塞进目标App进程里观察运行时数据或者Hook某个函数。第三种是给某个注入框架写插件插件本质上也是一个dylib需要按目标App的架构重新编译。这三种需求有一个共同点目标设备是arm64架构而你的开发机大概率是x86_64或者明明也是arm64但走的却是macOS那套系统库环境。直接把代码编译出来的二进制放到iOS的SpringBoard或者某个Daemon环境里跑要么是“Exec format error”要么是加载后直接崩。必须要针对iOS生态做一次交叉编译。1.2 为什么偏偏是Clang而不是GCC很多从Linux转过来的朋友会下意识问我Linux上有GCC能不能用来编iOS我劝你尽早放弃这个念头。iOS的ABI规范、Mach-O格式、可链写的动态库缓存都是围绕LLVM/Clang这套工具链构建的。你用GCC编出来的东西且不说能不能链接系统的Foundation框架光是符号调用约定和异常处理元数据就跟系统预期对不上。交叉编译最省心的方案永远是Clang。Clang做交叉编译不需要额外安装一套独立的“交叉编译器”它本身就是一个多目标编译器只要给对--target参数它就能在x86_64的主机上生成arm64的机器码。真正麻烦的是iOS SDK里的头文件和库但这些也不是编译器自己长出来的需要我们用参数指给它看。所以核心就三个词target、sysroot、linker。target告诉Clang生成什么架构的代码sysroot告诉Clang去哪找iOS的头文件和基础库linker负责把系统库和你自己的目标文件拼在一起。2. 准备一套能用的交叉编译环境2.1 从开发工具链里把SDK“挖”出来如果你手上有一台能装完整开发工具的macOS开发机那是最舒服的。Xcode装好后iOS SDK就躺在固定路径下/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk每次手动记这个路径太蠢系统提供了一个查询命令xcrun --sdk iphoneos --show-sdk-path它会帮你打印出真实存在的SDK路径。很多人会问我没有完整Xcode只有精简版命令行工具行不行实测下来不行iOS SDK不是命令行工具自发产生的它包含在系统中的平台包里。你可以在Xcode的组件里只选iOS Platform但最终还是得有一个完整的Xcode应用。如果是Linux环境情况稍麻烦一点。你需要从某台macOS电脑上把整个iPhoneOS.sdk目录同步到自己的开发机网上很多做iOS交叉编译的脚本就是这么干的。SDK本身是一堆头文件和tbd库文件同步过来之后放在一个固定目录后续所有命令里用-isysroot指给它就行。有一点必须提醒SDK版权上属于系统的一部分自己研究用可以别到处分发。2.2 验证你的Clang版本和交叉目标交叉编译的报错里有一大半是环境没配对。拿到SDK之前先确认Clang在不在clang --version正常情况下你能看到类似“clang version 15.x.x”的输出。之后可以再查一下当前编译器支持哪些目标方便后面排错clang -print-targets | grep -i arm在macOS上如果你装了完整Xcode我更推荐直接用xcrun包一层xcrun --sdk iphoneos clang -v这样可以保证你用的是Xcode内置的那套clang、SDK路径、头文件搜索规则而不是系统另外装的一个独立clang。Linux上则要确认lld已经装好因为后面链接阶段需要它来充当Mach-O链接器。典型安装命令是apt install clang lld这步没有捷径缺了lld后面跑-fuse-ldlld会直接报错。2.3 你的第一次交叉编译三行命令搞定环境都准备好了先写一个最简单的hello程序验证链路通不通。#include stdio.h int main(void) { printf(hello from arm64\n); return 0; }在macOS上用这一行编译xcrun --sdk iphoneos clang \ -arch arm64 \ -mios-version-min14.0 \ -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \ hello.c -o hello_arm64在Linux上对应的写法是clang --targetarm64-apple-ios \ -mios-version-min14.0 \ -isysroot /path/to/iPhoneOS.sdk \ -fuse-ldlld \ hello.c -o hello_arm64编译结束后用file看一眼输出文件如果出现Mach-O 64-bit executable arm64说明交叉编译链路已经通了。这一步通了后面所有复杂项目都是在这个基础上加参数。3. 核心细节参数、链接、签名3.1 target triple里的信息量别只盯着“arm64”很多人以为--targetarm64-apple-ios里的arm64是唯一重点其实后面三段每个都有讲究。完整格式是CPU-厂商-系统/环境。arm64是CPU架构apple说明是针对苹果生态的ABIios说明是iOS平台编译器会因此默认链接iOS的运行时、选用对应的异常处理模型和stub库特性。你要是误写成了arm64-apple-macos编译阶段可能还能过链接阶段就开始乱套了。macOS平台还有一个常用变体arm64-apple-ios-simulator这是给模拟器用的。模拟器的库和真机不一样别混用。真机一定要写arm64-apple-ios没有simulator尾巴。-mios-version-min14.0这个参数也千万别省它告诉编译器最低部署版本。iOS SDK里的很多API带API_AVAILABLE宏编译器会根据你的最低版本决定是直接引用高版本API还是生成低版本下的兼容路径。版本号设太低你会遇到一堆“unavailable”告警设太高老设备直接跑不了。3.2 头文件和框架的搜索路径是怎么生效的交叉编译时编译器不会去/usr/include翻系统的头文件那是给macOS用的。它只会去-isysroot指定的目录里找。iOS SDK内部有usr/include也有System/Library/Frameworks所以当你#include Foundation/Foundation.h的时候Clang实际找的是/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h如果你自己写了一个命令行工具但它的源码里放了一堆第三方头文件在/opt/local/include你需要显式用-I加进去否则编译器不会去那个目录找。链接阶段同样遵循sysroot。你在命令行写-framework FoundationClang会去SDK的Frameworks目录下找Foundation.framework。iOS SDK里的框架基本是tbd格式的文本符号桩链接器拿它做符号验证真正运行时系统会从动态库缓存里加载实际实现。3.3 链接时的符号依赖比Linux下“野”多了Linux下写程序链接就那么几个库。iOS上做命令行程序估计会让你找几次“undefined symbol”。举几个常用库-lobjcObjective-C运行时库写普通C时用不上但只要你用了Objective-C语法必须加。-lc或-lstdcC标准库写C工具时用。-framework Foundation最常用NSString、NSArray、NSLog全在这。-framework CoreFoundation很多底层工具只用它够了。真实项目里还经常会遇到 “_objc_msgSend” 找不到这种问题。原因是你在一个纯C文件里声明了objc_msgSend又没有链接libobjc。解决办法不是你在代码里瞎声明而是老老实实把-lobjc加到编译命令行里。对Objective-C代码千万别忘了-fobjc-arc不然ARC管理内存的代码编不过去。3.4 编译完不签名设备根本不让你执行编译链接成功只是第一关。iOS设备上无论你跑的是App还是命令行工具可执行文件都必须带合法代码签名否则调度器直接拒绝启动常见表现是执行瞬间进程就没了。你有两条路有完整的开发证书就用codesign做一个真机签名不想处理证书那么多事就用越狱社区里常见的轻量签名工具ldid做一个adhoc签名。# 用ldid做最简单签名 ldid -S hello_arm64 # 需要entitlements时 ldid -S entitlements.plist hello_arm64entitlements.plist里可以写权限声明比如?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keyplatform-application/key true/ keycom.apple.private.security.no-sandbox/key true/ /dict /plist我通常会再加上get-task-allow方便以后调试这个进程。签名这步最容易被新手漏掉漏了之后定位问题能浪费一下午。3.5 把零散参数写进脚本避免下次重新查Clang交叉编译的参数又多又长今天可能还记得隔一周准忘。我的习惯是写一个编译脚本把参数集中管理起来。比如一个极简的MakefileSDK ? $(shell xcrun --sdk iphoneos --show-sdk-path) TARGET ? arm64-apple-ios MINVERSION ? 14.0 hello: hello.c xcrun --sdk iphoneos clang -arch arm64 \ -mios-version-min$(MINVERSION) \ -isysroot $(SDK) \ hello.c -o $ echo build ok: $Linux环境下把前面的xcrun那行替换成clang --target$(TARGET)加-fuse-ldlld就行。脚本化以后你后续每次加参数只改需要变的地方省得一个不小心漏传SDK。4. 实操从源码到设备上跑通4.1 实战一C版命令行工具全流程我用一个模拟项目X来说明。项目X是一个设备端的小型网络探测工具只有一个main函数。完整流程如下# 1. 编译 xcrun --sdk iphoneos clang \ -arch arm64 \ -mios-version-min14.0 \ -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \ probe.c -o probe # 2. 检查 file probe # 3. 签名 ldid -S probe # 4. 推送到测试设备 scp probe rootdevice_ip:/tmp/probe # 5. 远程执行 ssh rootdevice_ip chmod x /tmp/probe /tmp/probe执行出来如果看到正常输出就说明你已经成功在电脑上交叉编译了一个iOS可执行文件并且在真机里运行了。这一步是整个交叉编译体系的基石。4.2 实战二编译Objective-C工具很多逆向工具免不了用Objective-C。逻辑不复杂只是编译器参数会多几个。#import Foundation/Foundation.h int main(void) { autoreleasepool { NSLog(Hello from Objective-C on iOS); } return 0; }编译命令xcrun --sdk iphoneos clang \ -arch arm64 \ -mios-version-min14.0 \ -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \ -fobjc-arc \ -framework Foundation \ -lobjc \ main.m -o objctool这里多出来的三个参数分别是-fobjc-arc启用自动引用计数-framework Foundation链接Foundation框架-lobjc链接Objective-C运行时。不链接-lobjc经常会在链接阶段报一堆_objc_retain相关的undefined symbol。推送到设备后运行输出里能看到日期前缀日志。这就是最小的Objective-C工具链交叉编译例子。4.3 实战三编一个可注入的动态库上面两个都是独立可执行文件。逆向里更常用的是动态库。比如模拟项目X注入插件源码是一个包含constructor函数的dylib它一被加载就打印一行日志#include stdio.h __attribute__((constructor)) static void on_load(void) { printf(injected dylib loaded\n); }编译和普通可执行文件有两点不同加-dynamiclib设置-install_name。xcrun --sdk iphoneos clang \ -arch arm64 \ -mios-version-min14.0 \ -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \ -dynamiclib \ -install_name loader_path/inject.dylib \ plugin.c -o inject.dylib使用loader_path是因为注入场景里dylib的绝对路径不固定用相对路径的占位符可以保证从任何App目录加载时都能找到自己。签名后把它放到设备上用你顺手的注入工具把它塞进目标进程。启动目标进程后如果看到“injected dylib loaded”说明整条链路又打通了一层。很多人在这一步踩坑编码时写的是绝对路径/usr/lib/inject.dylib运行起来系统找不着。换成rpath或loader_path就好多了。4.4 交叉验证的“体检三连”每次编完我习惯在推送前做三个检查# 1. 架构 file output # 2. 动态库依赖 otool -L output # 3. 签名信息 ldid -e output # 或 jtool --sig outputfile确认Mach-O架构otool -L确认链接的系统库路径符合预期隐藏的坑很多都藏在install_name里ldid -e查看签名中的entitlements是否写进去了。这三步锁定的问题能赶在设备端报错前就拦下来。5. 常见问题与排查技巧实录5.1 问题速查表这些报错是我和身边做逆向的朋友在交叉编译里见得最多的整理成一张表方便你直接对照。现象根因处理方式xcrun: error: SDK iphoneos cannot be locatedXcode路径没指对xcode-select --switch /path/to/Xcode.app或xcodebuild -runFirstLaunchfatal error: stdio.h file not found-isysroot没传或路径填错确保SDK目录存在命令行里必须带-isysrootzsh: Killed: 9签名无效或签名过期用ldid -S重新签名确认entitlements完整Unknown option: -fuse-ldlldLinux上的lld没装apt install lld或者去掉这行改用默认链接器Undefined symbols: _objc_msgSend没链接objc运行时命令行加-lobjc确保使用Objective-C的源码被识别Library not loaded: /usr/lib/inject.dylibinstall_name路径写死改用loader_path/inject.dylib或设置-rpathBad CPU type in executable编译成了x86_64检查是否漏了-arch arm64用file确认产物symbol not found ... normally in libSystem.B.dylib系统库版本和最低版本不匹配降低-mios-version-min到设备真实系统版本以下这张表不是全量但覆盖了80%入门阶段的坑。5.2 排查理念先确认产物再怀疑设备很多新手遇到设备跑不起来第一反应是设备设置、越狱环境、注入工具出问题。我的经验是先回到电脑上把产物验一遍。file可能只是告诉你架构还不够。我会顺手看一眼Mach-O的LC_BUILD_VERSION信息otool -l output | grep -A5 LC_BUILD_VERSION这里能看到编译时写的minimum OS version。假如你的设备是iOS 14产物里写的最低版本是iOS 16那当然跑不了。把编译参数里的版本号调低重新编一遍就好了。另一种常见情况是签名检查过但还带沙盒限制。这时用ldid添加com.apple.private.security.no-sandbox权限重新签名多数Killed问题能解决。5.3 Linux交叉编译的额外提醒如果你是在Linux上做最容易翻车的地方是SDK目录同步不完整。有时候只拷贝了Frameworks目录忘了拷贝usr/lib下的tbd链文件链接的时候报的错千奇百怪。检查方式很简单直接看SDK目录里有没有usr/lib/libSystem.tbd以及System/Library/Frameworks/Foundation.framework/Foundation.tbd。缺哪个补哪个。另外Linux下编出来的Mach-O默认是没有任何签名信息的我可以负责任地说漏签名连带上Fat二进制处理一起是Linux新手交叉编译时掉进去最深的一个坑。记得每次产物生成后一定要签。6. 常用参数速查与几条实战心得6.1 一页纸速查表我把常用参数列成一个速查复制下来贴在终端旁边参数作用--targetarm64-apple-ios指定真机目标--targetarm64-apple-ios-simulator指定模拟器目标-mios-version-min14.0最低系统版本影响兼容性判断-isysroot指定iOS SDK根目录-dynamiclib生成动态库-install_name设置动态库加载路径-framework链接系统框架-fobjc-arc启用ARC-fuse-ldlldLinux下指定lld链接器-Wl,-no_implicit_dylibs禁止隐式依赖某些动态库少用这个速查表够日常写工具用了更冷门的参数等遇到具体问题再查文档。6.2 两句真心话交叉编译这事儿第一次配环境可能要花一个晚上但一旦配好后面所有逆向工作都流畅很多。我见过的很多人不是技术不行而是被参数组合吓退总以为要用什么神秘魔法。其实本质就一条让Clang用目标系统的“字典”去理解你的代码。SDK做字典target定方向签名过门禁三者齐全就没有跑不通的二进制。我个人现在的工作流已经把这些命令全写进脚本了连注入插件的编译模板都存了一份。下次新项目改一下源代码路径跑一遍脚本就出产物。如果你刚开始接触建议你也这样先把第一个hello交叉编译跑通再慢慢拆解参数最后固定成自己的模板。这条路走通之后你会觉得iOS逆向里最折腾的工具链部分其实也就是一层纸。

相关新闻

QT5.13 TCP聊天程序:解决粘包乱码并发崩溃的实战方案

QT5.13 TCP聊天程序:解决粘包乱码并发崩溃的实战方案

简介:本资源是一套基于QT5.13.0实现的完整TCP通信实战项目,面向C与Qt初学者及网络编程入门者,聚焦服务端与客户端双向通信、多客户端并发处理、回车即时发送等核心功能,适用于聊天系统开发、物联网设备通信模拟等典型场景。压缩包…

2026/10/17 19:00:40 阅读更多 →
VR移动端光照优化:从Shadowmask到Subtractive的材质分级实战

VR移动端光照优化:从Shadowmask到Subtractive的材质分级实战

1. 项目缘起与整体优化思路拆解1.1 为什么要动光照模式这块硬骨头做VR项目的人都有一个共识:帧率就是命。普通PC游戏掉到45帧玩家可能忍一忍就过去了,但VR头显里一旦掉到72帧以下,眩晕感立刻上来,用户摘头显的速度比你优化代码的速…

2026/10/17 19:09:50 阅读更多 →
自动化识别JS加密函数,算法更新后十分钟完成爬虫适配

自动化识别JS加密函数,算法更新后十分钟完成爬虫适配

做爬虫维护的人基本都有过这种经历:头天还跑得好好的采集任务,第二天起来一看日志,大量请求失败,错误码全是参数校验不通过。不用查太深就知道,目标站点的JS加密逻辑又更新了。尤其是现在很多站点都会在前端用动态加密…

2026/10/17 16:00:46 阅读更多 →

最新新闻

大麦网自动抢票脚本快速上手:Automatic_ticket_purchase 新手完整指南

大麦网自动抢票脚本快速上手:Automatic_ticket_purchase 新手完整指南

大麦网自动抢票脚本快速上手:Automatic_ticket_purchase 新手完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase Automatic_ticket_purchase 是一个开源的大…

2026/10/18 1:33:47 阅读更多 →
Python课件高效学习指南:73页PPT拆解与实战路径

Python课件高效学习指南:73页PPT拆解与实战路径

简介:这份Python学习课件以73张PPT的形式系统梳理了Python入门阶段的核心知识,面向零基础初学者、高校学生以及需要快速回顾语法要点的开发者,帮助读者在较短时间内建立对Python语言的整体认知。压缩包内共1个PPT文件,大小约13.02…

2026/10/18 1:33:47 阅读更多 →
163MusicLyrics:免费的跨平台歌词提取工具,一键获取网易云与QQ音乐歌词

163MusicLyrics:免费的跨平台歌词提取工具,一键获取网易云与QQ音乐歌词

163MusicLyrics:免费的跨平台歌词提取工具,一键获取网易云与QQ音乐歌词 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 163MusicLyrics 是一款免费…

2026/10/18 1:33:47 阅读更多 →
Maven 3.6.3 稳定版安装配置与避坑指南

Maven 3.6.3 稳定版安装配置与避坑指南

简介:Apache Maven 3.6.3是Java生态中主流的项目构建与依赖管理工具,基于POM模型实现标准化生命周期。面向需要离线搭建Maven环境、或希望快速获得可复用依赖库的Java开发者,适用于内网开发、持续集成及教学实验等场景。压缩包共2000个文件&a…

2026/10/18 1:33:47 阅读更多 →
用C++从零实现一个OllyDbg风格调试器:事件循环、断点与反汇编

用C++从零实现一个OllyDbg风格调试器:事件循环、断点与反汇编

简介:这是一款基于Windows 10平台、以C/C语言实现的调试器源码工程,整体仿照OllyDebug设计,适合软件开发人员、逆向工程师及安全研究人员学习调试器底层机制与实战技巧。工程覆盖创建与附加进程、汇编代码查看与修改、内存/栈/寄存器操作、模…

2026/10/18 1:33:47 阅读更多 →
tiny11builder:1 条命令瘦身 Win11 镜像

tiny11builder:1 条命令瘦身 Win11 镜像

tiny11builder:1 条命令瘦身 Win11 镜像 【免费下载链接】tiny11builder WinUI app for building smaller, customized Windows 11 images. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 如果你的机器上有官方 Windows 11 ISO&#xff0…

2026/10/18 1:32:47 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →