背景
之前有提过一个链接优化方案[[Xcode]一种低成本的link耗时优化方案(二)],大致原理就是提前解析好静态库的路径。这里介绍一下在头条中接入时遇到问题。
sqlite异常
在头条App中开启此feature时,编译OK。但是好像开启feature后运行时更容易crash。起初没有在意,以为是工程本身的问题。经过排查。发现竟然是链接顺序造成的影响。使用-why_load debug符号加载过程,发现了一些猫腻。一部分符号在异常的包中是不存在的。
为何链接顺序会造成运行时异常
为什么异常包中,缺失一部分符号却不会报编译错误呢?
链接器在链接过程有一个阶段reslove symbol,这个阶段会从一个.o集合中查找对应undefine symbol真正所在的位置。如果没有找到会到系统库中进行查找。问题就出在这里,上面异常的包中缺失的符号在系统库中也存在! 如果我定义了一个跟系统库重名的函数怎么办?(在使用分类时就有可能遇到,所以我们一般会对分类增加一个前缀,不过这次我们遇到的错误是c函数)
跟系统库重名的函数
这里我构造了一个demo用来验证问题,代码如下,正常运行后应该打印的是hello。如果干掉cp.cpp那么会报错。这是期望的结果。运行后的效果也正是如此。
#import <Foundation/Foundation.h>
#import "cp.hpp"
int main(int argc, const char * argv[]) {
sqlite3_free(NULL);
return 0;
}
静态库cp
extern "C" {
void sqlite3_free(void *p);
}
#include <iostream>
#include "cp.hpp"
void sqlite3_free(void *p){
printf("hello");
}
根据上面的链接特性。如果链接了一个sqlite3的话。同时干掉cp.cpp的实现会如何呢?答案是没有报错!而且通过断点可以观察到,运行时调用的正是sqlite3的sqlite3_free函数。
那么继续验证链接顺序的问题。通过other link flags 切换链接顺序
如果先链接cp静态那么会正常进入sqlite3_free并打印hello
如果先链接sqlite动态库则会进入sqlite的sqlite3_free并且不会打印hello
到此验证完毕。头条中应该也是存在这种问题。目前通过diff观测出来的主要有两个库一个libasr一个WCDB
如何避免
根据上面的信息,我们应当给系统库中的重名函数改名。避免发生运行时异常。
关于App-Infra DevOps 团队
App-Infra DevOps团队作为公司的移动研发中台,致力于优化公司各业务的研发和交付过程中的质量、成本、安全、效率和体验。到目前为止我们已经有超过上百个业务接入,1万+人日常使用;平均每天支撑 3000+研发任务顺利交付;建设了业界领先且可能是国内最大的构建集群,每天运行20万+次构建任务。
我们期待更多有热情和创造力的同学加入字节跳动,为字节打造业界最领先,最高效的生产工具。
我们的工作内容主要包括:
- 提供任务管理,工程管理,开发调试,交付流程支持的一站式同开发平台。同时提供Native版及Web版,目标成为下一代端云协同的研发基础设施。
- 客户端 IDE 云化的探索性项目,目的是提供一整套线上编码、调试环境,让用户打开浏览器就可以进行代码开发,满足不同场景的需要,提升研发效率。
加入我们
北京-高级iOS开发工程师 — 终端技术 job.toutiao.com/s/2YHxkXW
职位描述
1、负责公司产品的通用技术研发和性能优化,完成高质量编码和测试工作 2、框架维护,通用工具开发等 3、设计良好的代码结构,不断迭代重构; 4、前沿技术研究,承担重点、难点的技术攻坚
职位要求
1、本科及以上学历,计算机、通信等相关专业 2、具有扎实的编程功底,良好的设计能力和编程习惯 3、熟练掌握Objective-C,C++,熟悉Swift的优先 4、熟悉bash/python/ruby/js的优先
上海-高级iOS开发工程师 — 基础技术 job.toutiao.com/s/2YHm8a7
职位描述
- 负责公司客户端产品的通用基础技术研发,完成高质量编码和测试工作
- 通用研发工具开发、通用框架开发等
- 设计良好的代码结构,不断迭代重构
- 前沿技术研究,承担重点、难点的技术攻坚
职位要求
- 本科及以上学历,计算机、通信等相关专业
- 具有扎实的编程功底,良好的设计能力和编程习惯
- 熟练掌握Objective-C,C++,熟悉Swift的优先
- 熟悉前后端相关和跨平台技术、熟悉bash/python/ruby/js等语言和相关框架的优先
杭州-高级iOS开发工程师 — 基础技术 job.toutiao.com/s/2YHdPAE
职位描述
- 负责公司跨平台相关技术研发,完成高质量编码和测试工作
- 负责通用跨端框架及周边工具开发等
- 设计良好的代码结构,不断迭代重构
- 前沿技术研究,承担重点、难点的技术攻坚
职位要求
- 本科及以上学历,计算机、通信等相关专业
- 具有扎实的编程功底,良好的设计能力和编程习惯
- 熟练掌握Objective-C,C++,熟悉Swift的优先
- 熟悉前后端相关和跨平台技术,熟悉bash/python/ruby/js等语言和相关框架的优先