1.[Dev] Xcode的源码记录
2.llvm是什么
3.LLVM源码编译及调试
4.编译技术入门与实践之LLVM概述及环境构建
5.写给入门者的LLVM介绍
6.(一)LLVM概述——介绍与安装
[Dev] Xcode的记录
构建过程可以分为预处理(preprocess) -- 编译(build) -- 汇编(assemble) -- 连接(link)这几个大的过程。
LLVM(Low Level Virtual Machine)是笔记强大的编译器开发工具套件,其核心思想是源码通过生成中间代码IR,分离前后端(前端编译器,笔记后端目标机器码)。源码这样做的笔记翻翻涨源码好处是,前端新增编译器,源码不用再单独去适配目标机器码,笔记只需要生成中间代码,源码LLVM就可以生成对应的笔记目标机器码。下面就是源码LLVM的架构。
预处理:头文件引入、笔记宏替换、源码注释处理、笔记条件编译等操作;
词法分析:读入源文件字符流,源码组成有意义的词素(lexeme)序列,生成词法单元(token)输出;
语法分析:Token流解析成一颗抽象语法树(AST);
CodeGen:遍历语法树,生成LLVM IR代码,这是前端的输出文件;
汇编:LLVM对IR进行优化,针对不同架构生成不同目标代码,以汇编代码格式输出;
汇编器生成.o文件:将汇编代码转换为机器代码,输出目标文件(object file);
连接器:将目标文件和(.dylib、.a、.tbd、.framework)进行连接,生成可执行mach-o文件。
dwarf:debugging with attribute record formats,一种源码调试信息的记录格式,用于源码级调试;
dSym:debug Symboles,调试符号,即符号表文件。nb iot源码符号对应着类、函数、变量等,是内存与符号如函数名、文件名、行号等的映射,崩溃日志解析非常重要。可以用dwarfdump 命令来查看dwarf调试信息。
DW_AT_low_pc表示函数的起始地址 DW_AT_high_pc表示函数的结束地址 DW_AT_frame_base表示函数的栈帧基址 DW_AT_object_pointer表示对象指针地址 DW_AT_name表示函数的名字 DW_AT_decl_file表示函数所在的文件 DW_AT_decl_line表示函数所在的文件中的行数 DW_AT_prototyped为一个 Bool 值, 为 true 时代表这是一个子程序/函数(subroutine) DW_AT_type表示函数的返回值类型 DW_AT_artificial为一个Bool值,为true时代表这是一个由编译器生成而不是源程序显式声明
使用symbolicatecrash命令行
使用dwarfdump和atos工具
xcode-project-file-format这里对xcodeproj文件格式进行了说明。
xcodeproj文件包含以下元素
总体说明
结合上面的说明,对project.phxproj文件结构进行说明
项目中setting有2处,project和target中都有,那么他们之间的关系是怎样的?
在Xcode中添加代码块步骤
1、选择代码,右键选择 create code snippet,或者在顶部导航,选择Editor-create code snippet;
2、编辑信息和代码即可,其中completion表示输入的快捷方式;
3、需要修改的参数用形式添加 ;
4、所在目录~/Library/Developer/Xcode/UserData/CodeSnippets 。
还需要注意xcshareddata目录下
参考
Xcode build过程中都做了什么 Xcode编译疾如风-3.浅谈 dwarf 和 dSYM iOS崩溃日志解析&原理 - 掘金 LLVM编译流程 & Clang插件开发 8. Xcode 工程文件解析 - 掘金 XCode工程文件结构及Xcodeproj框架的使用( 二 ) XCode: Target Settings和Project Settings的区别 Xcode-项目重命名
llvm是什么
LLVM是一个开源的编译器基础设施项目。它是采用LLVM技术的工具的集合体,包含了静态编译器,全局共享环境的完整程序构造以及能够重构优化的动态二进制执行系统等重要部分。LLVM的目标是提供一种可扩展的、模块化的框架,允许开发人员以一种统一的方式来处理程序的编译过程。 关于LLVM的vivo便签源码详细解释: 1. LLVM的基本概念:LLVM是Low Level Virtual Machine的缩写,这是一个通用的编译工具和库集合,这些工具与库旨在以高度优化的方式生成代码。它不仅包含一套编译器工具链,如Clang前端工具,还包含一系列运行时库,这些库为各种语言提供了高效的运行时支持。 2. LLVM的特性:LLVM提供了许多重要的特性来支持程序的编译与执行过程。其中包括支持多种语言编程的通用编译器架构、代码生成的高效性和灵活性以及高度的模块化设计,使得开发人员能够根据需要选择不同的工具和库来实现不同的功能。此外,LLVM还提供了丰富的优化选项和调试支持,使得开发者能够更容易地调试和优化他们的代码。 3. LLVM的应用场景:由于LLVM的强大功能和高效性能,它被广泛用于多种场景。无论是操作系统开发、高性能计算还是嵌入式系统等领域,都可以看到LLVM的身影。同时,许多知名的软件项目也采用了LLVM技术来提高其性能和稳定性。此外,由于LLVM是开源的,开发者可以自由地访问和使用其源代码,这使得LLVM能够在开源社区中得到广泛的应用和推广。最后值得一提的是,使用LLVM的静态编译功能可以有效避免运行时内存注入漏洞带来的安全隐患问题,因而很多行业应用的软件和嵌入式系统中都开始采用LLVM技术。LLVM源码编译及调试
为了深入理解并实现LLVM源码的编译与调试,我们需要分步骤进行,逐一安装相关软件并配置环境。d盾源码首先,安装cmake,这是构建过程的核心工具。 在Linux环境下,我们可以使用tar命令来下载并解压cmake的安装包。具体的步骤是:访问cmake官网,下载cmake-3..0-rc2-linux-x_.tar.gz。
使用tar命令解压文件:`tar xf cmake-3..0-rc2-linux-x_.tar.gz`。
将解压后的文件移到/usr/share目录,并重命名为cmake-3..0-rc2-linux-x_以方便访问。
创建软连接,将cmake-3..0-rc2-linux-x_/bin/cmake移动到/usr/bin目录,并重命名为cmake,确保它可以被直接调用。
然后,安装ninja,这是构建过程中高效的任务执行工具。使用git克隆ninja的源代码。
运行配置脚本以生成构建文件。
复制ninja到/usr/bin目录。
通过`ninja --version`检查ninja的安装情况。
接下来,安装Python、gcc和g++,这是构建LLVM环境的基本依赖。 之后,安装LLVM。我们可以通过git克隆LLVM项目并进行配置、构建和安装。克隆LLVM项目。telnet VB 源码
指定版本(例如,基于特定版本)。
切换到项目目录并使用cmake进行配置。
使用预先选择的构建系统(如Ninja)和选项进行构建。
执行构建并使用ninja命令进行编译。
调试LLVM源码涉及查看支持的后端target、使用前端编译器(clang)生成LLVM IR、使用LLVM工具(如llc)进行调试、并使用graphviz生成可视化图表。 在调试过程中,可以使用以下工具:查看各阶段DAG使用llvm-dis。
查看AMDGPU寄存器信息与指令信息使用llvm-tblgen。
通过上述步骤,您可以成功安装并配置LLVM源码的编译环境,并进行有效的调试与分析。编译技术入门与实践之LLVM概述及环境构建
本系列旨在记录学习过程和知识总结,便于后续交流。我专注于智能芯片研究,编译器设计是实践中的常见挑战,最近实验中涉及LLVM pass,处理源代码到数据流的转换。
LLVM是一个集成了模块化技术的编译器项目,非传统虚拟机概念,全称为LLVM项目。最初由伊利诺大学发起,目标是创建基于SSA策略的现代化编译策略,支持多种语言的静态和动态编译。它包含众多子项目,如LLVM core、Clang、LLDB等,广泛应用于学术和商业领域,以其通用性、灵活性和可重用性为特点。
LLVM的核心子项目包括:LLVM core提供源码和目标代码隔离的优化器,支持多种CPU;Clang是C/C++编译器,包含自动code检查工具;LLDB是高效调试器,基于LLVM核心和Clang;libc++与libc++ ABI提供C++标准库;compiler-rt提供底层代码生成优化;MLIR构建可扩展的编译器架构;OpenMP支持OpenMP在Clang中的使用;Polly进行本地化优化和并行化;libclc开发OpenCL标准库;klee则提供符号化虚拟机以检测bug。
实验准备部分,LLVM项目包含一系列工具和库,如汇编器、反汇编器等,用于处理LLVM中间表示和目标文件的转换。获取源代码时,需要明确硬件平台和软件环境。在Ubuntu系统中,可能需要升级cmake、安装openssl等。构建LLVM和Clang时,遵循官网指南,配置后执行make或ninja命令进行编译,并可能需要解决一些编译错误。
写给入门者的LLVM介绍
LLVM 是一个先进的编译器框架,包含用于多种编程语言的实现,如 C、C++、Objective-C 等。它不仅支持即时编译(JIT),还适用于非 C 家族语言。LLVM 的核心优势在于其统一的中间表示(IR)格式,使得整个编译流程能够保持一致性和高效性。理解 LLVM 对于从事编译器研究、程序优化和系统级编程具有重要意义。对于非编译器研究者,学习 LLVM 有助于分析程序行为、提升程序性能,特别是在数据处理框架中使用高阶API或SQL时,能显著提升运行效率。LLVM 的灵活性使其不仅局限于新编译器的实现,还能用于源码到源码的转换优化。
安装 LLVM 可以通过 Linux 发行版的包管理器完成,确保安装包含所有必要的头文件。在 macOS 上,参考 Brandon Holt 的教程进行安装。API 文档是学习 LLVM 的关键资源,通过 Google 搜索特定函数或类名,可以快速找到相关页面。对于 IR dump 的语法,有专门的参考手册提供帮助。程序员手册介绍了 LLVM 特有的数据结构和高效工具,如字符串、maps 和 vectors 的替代方案,以及快速类型自省工具。学习如何编写 LLVM Pass 是深入理解 LLVM 的重要一步。模板代码和构建步骤提供了从头开始的指导。了解 LLVM IR 的结构有助于理解其基本组件,如函数、基本块和指令。通过查看 IR,可以直观地分析和修改代码。
构建一个简单的 LLVM Pass 涉及设置 Pass 的实现、构建、运行和分析 IR。对于更复杂的转换,可以链接到自定义运行时库,实现更高级的代码生成和优化。传递额外信息给 Pass 是通过特定工具完成的。学习 LLVM 不仅可以应用于编译器研究,还能在程序优化和系统级编程中发挥重要作用。希望本文提供的信息能帮助您开始探索 LLVM 的强大功能,欢迎分享您的成果和反馈。资源包括官方文档、教程和参考资料。
(一)LLVM概述——介绍与安装
LLVM,全称Low Level Virtual Machine,是一个集成了模块化和可重用编译器技术的开源框架。该项目由Chris Lattner和Vikram Adve在年创立,初衷是为了实现基于SSA的现代编译策略,适用于静态和动态编译,目标语言广泛。LLVM因其高效和灵活性而成为当今最热门的编译器平台,使得开发者有能力构建自定义编译器。
安装LLVM,有多种途径可供选择。对于Debian/Ubuntu用户,官方提供了安装脚本,只需在源列表中添加相应信息,然后通过apt命令安装。特别地,安装clang编译器时,LLVM库会自动安装,而lldb等其他组件则需单独安装。对于macOS用户,可选择从源代码编译,需确保系统中已安装必要的软件环境,如使用make或ninja构建工具,编译过程会产出在指定目录下的产物。
需要注意的是,由于编译过程可能涉及多个步骤和依赖,本文可能未涵盖所有细节,如有疏漏之处,欢迎读者指正,作者将深感荣幸。
Obfuscator-llvm源码分析
在逆向分析中,Obfuscator-llvm是一个备受关注的工具,它通过混淆前端语言生成的中间代码来增强SO文件的安全性。本文主要讲解了Obfuscator-llvm的三个核心pass——BogusControlFlow、Flattening和Instruction Substitution,它们在O-llvm-3.6.1版本中的实现。
BogusControlFlow通过添加虚假控制流和垃圾指令来混淆函数,其runOnFunction函数会检查特定参数,如混淆次数和基本块混淆概率。在测试代码中,它会将基本块一分为二,插入随机指令,形成条件跳转,如“1.0 == 1.0”条件下的真跳转和假跳转。
Flattening通过添加switch-case语句使函数结构扁平化,runOnFunction会检查启动标志。在示例代码中,它将基本块分隔,创建switch结构,并根据随机值跳转到不同case,使函数执行流程变得复杂。
Instruction Substitution负责替换特定指令,runOnFunction会检测启动命令,遍历所有指令并随机应用替换策略,如Add指令的多种可能替换方式。
虽然O-llvm提供了一定程度的混淆,但仍有改进空间,比如增加更多的替换规则和更复杂的跳转策略。作者建议,利用O-llvm的开源特性,开发者可以根据需求自定义混淆方法,提高混淆的复杂性和逆向难度。
最后,对于对Obfuscator-llvm感兴趣的读者,可以参考《ollvm的混淆反混淆和定制修改》的文章进一步学习。网易云安全提供的应用加固服务提供了试用机会,对于保护软件安全具有实际价值。
更多关于软件安全和源码分析的内容,欢迎访问网易云社区。