查看原文
其他

用rust实现苹果的atos工具,atosl-rs发布啦

everettjf 架构技术评论 2022-08-31



背景

atos 是苹果提供的地址翻译为符号的工具,字面意思就是 address to symbol 。然而只能运行在macOS上,而很多大型app自建的符号解析服务器更期望使用linux来进行扩展,于是,最早有facebook(meta)开发了 atosl (atos for linux) https://github.com/facebookarchive/atosl 作为linux上的atos。

然后facebook早已经不维护了,github还能搜到另一个atosl https://github.com/dechaoqiu/atosl ,只是也很多年不维护了。

当然很多年前笔者在阿里时,就了解到阿里很早就实现了linux上的符号解析。前不久,字节跳动也实现了自己的符号解析技术分享,讲解了符号解析的方案 https://mp.weixin.qq.com/s/TVRYXhiOXIsMmXZo9GmEVA 其中也提到了一些类似的atosl工具。原理也可以见这篇文章。

atols-rs

笔者学习rust有一段时间,一直想找个小项目练练手,于是最近想到了这个atosl工具,经过近期一段时间的学习研究,终于在元旦这几天用rust实现发布了出来。

代码见:https://github.com/everettjf/atosl-rs

目前只实现了atos最基础的功能,使用方法如下:

// for dwarf
atosl -l 4581015552 -o "full path to dwarf file" 4674962060 4786995348

// for macho
atosl -l 9093120 -o "full path to libsystem_malloc.dylib" 6754325196 
  • 其中 -l -o参数与苹果的atos保持一致。
  • -l 一般是binary image的加载地址
  • -o 就是dSYM符号文件或者没有strip过符号的macho文件
  • 地址同时支持了10进制和16进制(系统仅支持16进制,需要0x开头)
  • 支持了多个地址的翻译,结果输出按照输入顺序一行一个
  • 翻译不出的地址,会输出"N/A"(没有引号)
  • 支持swift和c++符号的自动demangle

安装方法

安装有两个步骤,

第一步,安装rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

第二步,安装atosl

cargo install atosl

然后就可以命令行输入atols了。

$ atosl --help

USAGE:
    atosl [OPTIONS] -o <OBJECT_PATH> -l <LOAD_ADDRESS> [ADDRESSES]...

ARGS:
    <ADDRESSES>...    Addresses need to translate

OPTIONS:
    -l <LOAD_ADDRESS>        Load address of binary image
    -o <OBJECT_PATH>         Symbol file path or binary file path

性能

目前在输入dSYM时,大多数情况地址是顺序查找的,性能比较差。在查找多个地址时,也是逐个顺序查找。后续会优化下哈。

总结/原理

其中用到了如下rust的依赖库,

gimli = "0.26.1"
memmap = "0.7.0"
object = "0.28.1"
symbolic-common = "8.5.0"
symbolic-demangle = "8.5.0"

这些高质量的rust库,用起来,真的很舒服。从rust库管理方面( https://crates.io/ ),可谓是相比c++最好用的地方了。

实现原理可见代码 

https://github.com/everettjf/atosl-rs/blob/main/src/atosl.rs

目前300多行代码。具体的原理这篇文章就不展开了哈,后续性能优化后的版本可能会单独写一篇原理介绍和性能优化思路介绍,目前有需要了解原理可以结合代码并参考字节的文章 https://mp.weixin.qq.com/s/TVRYXhiOXIsMmXZo9GmEVA ,有疑问可以加下面群里提出。

技术社群

最后,有兴趣可以加群讨论。由于微信群最多500人的限制,为了让更多人能交流iOS开发技术,并相互提供更多细分的职位信息。我创建了一个“飞书群”,飞书群没有500人上限的限制,而且我平时工作就用,能更多的与大家交流。

大家可以App Store下载“飞书”,并扫码进群。目前群内有900多成员了,大家早早加入,多多分享哈。

最最后,如果碰巧你最近在寻找iOS相关职位,可以看看这篇文章 简聊抖音iOS基础技术有哪些岗位适合你



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存