iOS二进制文件大小 - LinkMapFile分析

什么是Link Map File什么是快乐星球? 什么是Link Map File?链接映射文件,是Xcode生成的一个链接过程记录文件。Xcode在构建可执行文件的过程中,先对每个文件进行单独编译生成目标文件(.o文件),然后再将目标文件链接生成最终可执行文件,Link Map File就是记录链接过程中的信息文件,它用来描述可执行文件的具体结构,包含可执行文件代码段、数据段等地址分布信息有什么作用用来分析二进制大小组成,分析二进制类大小,可以找出体积增长缩小趋势原因等如何开启Xcode默认配置下是不生成Link Map file的,需要手动开启。具体开启方式为:在Xcode项目工程 Project -> Build Setting 中找到 Write Link Map File 选项,设置为Yes然后在 Path to Link Map File 选项中配置生成的文件存放位置例如:$(SRCROOT)/$(PRODUCT_NAME)-LinkMap-$(CURRENT_VARIANT)-$(CURRENT_ARCH).txt文件结构生成的的Link Map File文件内容中
Link Map File 2021年02月26日 2,218次浏览

iOS组件二进制源码调试热切换方案

现状现在工程中大量组件已经是二进制形式接入,二进制接入带来的好处是工程编译时间短,但是弊端也很明显,那就是调试麻烦,打成二进制的组件就是一个黑盒,工程遇到crash或者断点调试的时候就没法看到源码,当前工程支持二进制和源码两种接入方式,可以通过调整podfile中的组件源切换成源码接入,但是这样又得重新install安装源码,再重新编译工程,整个过程最快也得耗时数分钟,且偶发的crash还无法还原堆栈情况。那么在组件是二进制接入的情况下,能不能够实现在断点中断或者crash产生的时候快速关联映射到源码?答案是可以的!DWARFDWARF是一种调试信息格式,通常用于源码级别调试。能够为调试器提供必要的调试信息,例如PC地址对应的文件名及行号等信息。如果在打包静态库的时候,没有裁减掉调试信息,那么静态库Mach-O文件中存在一个__DWARF段,这个段就保存了相关调试信息,包含符号对应的源码文件位置等信息,在用lldb进行调试的时候,调试器就会更新__DWARF段的相关信息去查找源码,然后关联显示出来。可以使用系统自带的DWARF查看工具dwarfdump查看静态库的调试信息,可以看到如下
LLDB 2020年05月01日 4,053次浏览

Cocoapods-packager源码安装

Gem 官方源中维护的 cocoapods-packager 版本还是1.5.0版本,已经是很老的版本了。下面流程可以基于源码来本地打包安装。
Cocoapods 2020年01月02日 3,055次浏览

Mach-O二进制

Mach-O 是苹果公司自己维护的且独有的二进制格式,它是 Mach Object File Format 的简写,这是一个源于 NeXTSTEP 的项目。苹果官方对于 Mach-O 相关的文档很少,不过好在有开源的 [XNU](https://opensource.apple.com/source/xnu/xnu-6153.11.26/EXTERNAL_HEADERS/mach-o/) 源码,里面可以找到一些 Mach-O 相关的信息,如果感兴趣可以阅读一下
Mach-O 2019年12月14日 5,317次浏览

OCLint规则说明

Introduction依赖 OCLint 0.13 版本,共计71条rule。字段说明:Since:规则生效版本Name:规则名称Rule IndexBasicBitwiseOperatorInConditionalSince: 0.6Name: bitwise operator in conditional检查条件语句中的位操作。虽然在一些情况下是故意编写的,但是位操作被认为太”巧妙”了。太巧妙的代码不太容易被理解。规则定义文件: oclint-rules/rules/basic/BitwiseOperatorInConditionalRule.cpp示例:void example(int a, int b){ if (a | b) { } if (a & b) { }}BrokenNullCheckSince: 0.7Name: broken null check错误的 null 检查会导致程序 crash。规则定义文件: oclint-rules/rules/basic/BrokenNullCheckRule.cpp示例:void m
2019年08月08日 3,077次浏览

MariaDB-10安装

本文是在CentOS7中安装MariaDB(MySql)的一些常见操作步骤,在CentOS7默认的yum源中是没有MariaDB数据源的,所以要么采用手动下载安装包进行安装,要么手动添加MariaDB的yum下载数据源,再使用yum命令进行安装,这里使用的就是后面这种方式。创建MariaDB.rep
mariadb 2019年03月01日 4,069次浏览

Autoreleasepool底层原理

Autoreleasepoolintmain(intargc,constchar*argv[]){@autoreleasepool{//}return0;}使用clangrewrite命令重写main.m文件:clang-rewrite-objcmain.m最终生成了一个main.cpp文件,进文件找到main()函数:intmain(intargc,constchar*argv[]){/*@autoreleasepool*/{__AtAutoreleasePool__autoreleasepool;}return0;}根据注释/*@autoreleasepool*/可以得知@autoreleasepool{}被转换了一个__AtAutoreleasePool类型的变量__autoreleasepool,在main.cpp文件里搜索一下__AtAutoreleasePool,可以得知__AtAutoreleasePool是一个结构体:struct__AtAutoreleasePool{__AtAutoreleasePool(){atautoreleasepoolobj=objc_aut
2018年05月07日 2,964次浏览

IPFS

IPFS(InterPlanetaryFileSystem,星际文件系统)是一个旨在创建持久且分布式存储和共享文件的网络传输协议。自2014年开始由ProtocolLabs(协议实验室)在开源社区的帮助下发展,其最初由JuanBenet设计,它是一个开源代码项目。IPFS本质上是一种内容可寻址、版本
IPFS 2017年10月14日 4,741次浏览

DYLD

在iOS和macOS系统中,几乎所有的程序都会用到动态库,而动态库在加载的时候都需要用dyld进行链接。dyld全称是dynamicloader,它是完全开源的,不过苹果官方关于dyld的文档很少。App可执行文件在内核加载后,根据Mach-O加载命令中LC_LOAD_DYLINKER命令获取dyld路径(位于/usr/lib/dyld),然后加载dyld,加载完成后dyld进行初始化、缓存加载、依赖库加载等等工作,最后返回Appmain()函数地址,main()函数调用后,就进入了程序的入口。ThedynamicloaderforDarwin/OSXiscalleddyld,anditisresponsibleforloadingallframeworks,dynamiclibraries,andbundles(plug-ins)neededbyaprocess.Appledeveloperdocument:DynamicLoaderReleaseNotes整体流程已知objc的初始化入口函数_objc_init(如果还不了解objc,请自行查询相关资料补充)是由libSystem调
dyld 2017年09月01日 3,424次浏览

Truffle tutorial

Truffle是针对基于以太坊的Solidity智能合约开发的一套开发框架,本身基于Javascript。Truffle对客户端做了深度集成,开发、测试、部署一行命令都可以搞定,不用再记那么多环境地址,繁重的配置更改,及记住诸多的命令。它提供了一套类似maven或gradle这样的项目构建机制,能自
2017年06月16日 3,451次浏览