首页
学习
活动
专区
工具
TVP
发布

homura的博客

专栏成员
56
文章
26934
阅读量
13
订阅数
LLVM异常实现零 异常的多层结构与实现方式
本系列的博客的内容是LLVM异常实现的整个过程,从C++生成LLVM IR开始,到运行时实际调用的库函数,会从抛出异常的过程开始结合llvm相关的代码进行讲解。这一期主要内容是讲解异常相关的结构、底层实现方式等基础信息,之后从顶向下逐层分解其中的实现(这部分形式有些类似于笔记),在最后一期会将整个结构串起来,同时有一个流程图供读者进行参考,中间几期细节比较多,很容易迷失在其中,可以参照最后一期的图来阅读中间的内容。
AkemiHomura
2024-10-03
940
LLVM异常实现四 personality
前面libunwind的过程中多次和personality进行交互,这部分是由语言提供和语言相关的内容。libunwind的两个阶段对应到这一个函数之中,personality部分根据libunwind扫描到的平台相关的信息,在ehframe中扫描到当前栈帧对应的异常处理信息。
AkemiHomura
2024-10-03
920
LLVM异常实现三 libunwind
上期提到的__cxa_xxx相关函数的实现离不开libunwind的相关接口,libunwind专门用于平台无关的堆栈展开和错误处理,内部做了很多平台相关的兼容工作,这期我们主要来介绍一下libunwind相关接口的具体实现。
AkemiHomura
2024-10-03
650
LLVM异常实现二 libcxxabi
在之前的博客提到带有异常相关的C++代码编译成llvm ir后,会插入libcxxabi的__cxa_xxx函数,这期则是来了解这些函数的实现。
AkemiHomura
2024-10-03
600
LLVM异常实现一 LLVM IR
这一期我们通过编译C++到LLVM代码来查看这部分的实现。在此之前我们需要了解一些简单的基础知识,之后我们将从一个最小抛出异常的代码开始,逐渐复杂化这个例子,查看生成不同的LLVM IR来理解整个过程。
AkemiHomura
2024-10-03
870
LLVM异常实现五 总结回顾
整个异常处理的过程中,涉及到各种层级之间相互调用,同时还有一些函数还会负责处理不同的功能(比如说personality会同时处理search以及clean),这都导致了整个过程相对复杂,因此在这里选择将异常抛出的整个过程再次用文字整理一遍,省略去庞大的代码细节的同时相对轻易的看到了整个过程是如何运转,都做了哪些事情,利于我们的理解。
AkemiHomura
2024-10-03
1090
mold源码阅读十三 计算shdr以及osec offset
本期的内容主要是更新section header以及set output section offsets相关。当这些操作结束后,虚拟地址会固定,因此输出文件的memory layout就固定下来了。
AkemiHomura
2023-10-22
2340
mold源码阅读十二 创建一些输出段
这里对verdef和verneed段进行构造,实际写入内容。其中包含了字符串信息,因此还会将字符串写入dynstr中。
AkemiHomura
2023-10-22
1800
mold源码阅读十一 relr and dynsym
将OutputSection以及Got中的relocations以压缩的形式存储到relr.dyn,在这之后rel段的大小和layout就固定了。
AkemiHomura
2023-10-22
2960
mold源码阅读九 未解析符号的处理
本期内容主要是claim_unresolved_symbols的部分,其次是其他一些简单的处理
AkemiHomura
2023-10-22
1970
mold源码阅读八 创建输出段
上一期介绍了一些创建输出段之前的工作,本期主要是把创建输出相关的最后一些前置准备讲解完成。根据代码中的注释,add_synthetic_symbols以后,不会再有任何新的文件添加到ctx.objs和ctx.dsos中了。之后会再讲解简单的命令行参数处理,下一期再讲对于输出chunk中的一些处理
AkemiHomura
2023-10-22
1620
mold源码阅读十四 固定文件layout以及创建输出
上一期主要讲解了shdr计算更新的部分以及osec offset的设置,这期则是做链接最后的工作。上期在对段shrink的时候也提到部分synthetic的符号值还未固定,本期就会从这部分的值提起,之后则是对debug_section进行压缩,同时文件的大小也会产生变化,到了这里整个文件内部的layout以及文件的大小也就固定了。
AkemiHomura
2023-10-16
2160
mold源码阅读十四 固定文件layout以及创建输出
上一期主要讲解了shdr计算更新的部分以及osec offset的设置,这期则是做链接最后的工作。上期在对段shrink的时候也提到部分synthetic的符号值还未固定,本期就会从这部分的值提起,之后则是对debug_section进行压缩,同时文件的大小也会产生变化,到了这里整个文件内部的layout以及文件的大小也就固定了。
AkemiHomura
2023-10-16
2770
mold源码阅读十五 最后的收尾工作
将所有依赖,也就是链接过程中所有读取的文件,并且写入到文件中。可以用于确认某个文件是否被加入到链接过程中。
AkemiHomura
2023-10-16
2460
mold源码阅读七 创建输出段之前
上期的内容主要是section size相关的优化,这期内容是创建输出段前的最后一些处理
AkemiHomura
2023-05-21
3160
mold源码阅读六 section size优化
上一期我们讲解了一些符号相关的处理,这一期我们来讲一些对于section size的优化处理。
AkemiHomura
2023-05-10
5480
mold源码阅读五 符号相关
上期讲完了resolve_section_pieces,在这之后本应是combine_object,但是combine_object几乎包含了后面的所有过程,因此等到整个流程讲完后或许会再回来讲,这一期的内容以符号版本的处理为主。
AkemiHomura
2023-05-03
3080
mold源码阅读 其四 mergeable section
上一期的内容讲完了一些针对文件的简单处理以及符号决议,这一期的主要内容是在这之后针对mergeable section的决议与合并。
AkemiHomura
2023-04-24
3700
mold源码阅读 其三 符号决议
前面两期将读取输入的部分全部讲完了,本期开始涉及链接过程中的处理。在讲主要的符号决议之前,先讲一下mold在符号决议执行之前做的一些其他处理。
AkemiHomura
2023-04-12
3690
mold源码阅读 其二 读取SharedFile
这期的内容主要是讲完读取输入的部分,有一些之前遗漏的信息,以及之前未讲完的初始化ehframe以及shared object读取的部分。有许多地方默认读者读过上期内容,建议先阅读上期内容后再来查看本期。
AkemiHomura
2023-04-07
4050
点击加载更多
社区活动
【纪录片】中国数据库前世今生
穿越半个世纪,探寻中国数据库50年的发展历程
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档