静态库(static Libraries)
格式为.a, 静态库可以理解为多个目标文件 (object file, 以 .o 为后缀) 的打包集合.
优势
提供的是目标文件, 所以不需要重新编译, 只需要链接即可 加载 App 速度更快, 因为在编译时已经进行了链接, 因此启动时不需要进行二次查找启动
动态库(tbd, dylib)
不会在编译时直接置入 app, 而是将动态库的信息置入 app, 然后 app 运行的时候去动态查找动态库并进行链接, 这一步也叫做动态链接.
Framework
- 一个除了代码之外,包含其他资源(通常在Resources文件夹中)的动态库(dylib)或静态库(a)
- 包括国际化字符串(在lproj目录中)、GUI定义(Nib文件)和多媒体文件(如图像或音频)。有时候框架也可能包含Support可执行程序,比如提供服务所需的守护进程(daemon)(通常在support文件夹中)。框架还可以包含XPC bundles(在XPCServices文件夹中)。
- 像普通的库一样,framework 可以有版本控制。框架的当前版本被象征性地链接为“current”。大多数文件夹只包含一个版本的框架,所以符号链接是不必要的,但它允许扩展和并行部署多个版本——避免在Windows中经常遇到的“DLLhell”问题。除了少数例外(如Foundation、AppKit),框架版本都是“A”,可以通过如下命令查看系统 framework 中版本不为 A 的特殊版本。
find /System/Library/Frameworks -name Current | xargs ls -l | grep -v A
/System/Library/Frameworks/Foundation.framework/Versions/Current -> C
/System/Library/Frameworks/Message.framework/Versions/Current -> B
/System/Library/Frameworks/Ruby.framework/Versions/Current -> 2.6
/System/Library/Frameworks/System.framework/Versions/Current -> B
/System/Library/Frameworks/Tcl.framework/Versions/Current -> 8.5
/System/Library/Frameworks/Tk.framework/Versions/Current -> 8.5
Standard Framework和Umbrella Framework
Framework分为Standard Framework和Umbrella Framework两种
- Standard Framework不能包含Sub Framework; Umbrella Framework可以包含子Framework;
- Standard Framework可以直接引用需要使用的头, 也可以通过引用Master Header file(Umbrella Header)来引用需要使用的类; Umbrella Framework需要通过引用Umbrella Header来引用需要使用的类;
- 著名的Umbrella Framework例子包括 Cocoa.framework, Quartz.framework 和 WebKit.framework。
tbd
tbd文件是“基于文本的库链接”, 文本中注明真正链接的库的位置。
Private Framework
- Private Framework 被归类为苹果内部框架,Apple不提供任何头文件或文档。
- MacOS和iOS共享许多framework。然而,有些framework在iOS中被定义为“私有”,而在MacOS中为 public(提供图形服务的IOSurface.framework就是一个典型的例子)。
- 任何框架(包含私有框架)都可以使用-framework 进行链接,框架路径可以用-F指定,可以设置为/System/Library/PrivateFrameworks中的私有 framework。
- 开发者被警告不要使用私有框架,因为api会在没有警告的情况下发生变化。此外,App Store禁止使用任何来自私有框架的api——这很容易通过查看可执行文件的库依赖来验证。
三方库(third party library)
- MacOS 和 iOS 系统遵循通用 Unix/Linux 的标准,所以支持 Unix/Linux 中各个通用的三方库
- 大多数三方库仍然以.dylib的形式存在,最终存放在/usr/lib中, 有时,苹果可能进一步将库打包为Framework。在 opensource.apple.com 上,苹果提供了大多数三方库的源代码和Apple内核源代码。 如下列出了一些重要的第三方库及其用法:
libboringssl: 谷歌的OpenSSL库 (boringssl.googlesource.com/) libz, libbz2: 压缩支持 libcmph: C最小完美哈希(cmph.sourceforge.net/) libcharset libiconv: Unicode支持 libncurses: 终端支持 libcups: 通用UNIX打印系统 libpam: 认证模块支持 libpcap: 网络数据包捕获 libmarisa: 递归实现存储的匹配算法 libprotobuf: protobuf 数据序列化支持 libsqlite3: sqlite3 数据库支持 libxml: XML解析
- 在某些情况下,Apple 更喜欢自己的实现,而不是现有的开源实现。
- 最好的例子或许是苹果的加密库。它由CoreCrypto和CommonCrypto项目组成,它们在很大程度上提供了与OpenSSL的libcrypto相同的功能,以及Security.framework中提供协议支持(libssl)和许多其他特性的更高层次。
- 不使用OpenSSL为苹果省去了许多安全漏洞,但并不是万灵药。实际上,代码中的一个简单错误——被称为“goto fail”bug(官方名称为CVE-2014-1266)实际上导致了一个漏洞,影响了7.0.6之前的iOS版本和10.9.2之前的MacOS版本。另一方面,以前也有许多开源软件包含bug的情况,而Apple在不知不觉中也继承了这些bug。
System Library
- MacOS 和 iOS 底层核心库: /usr/lib/libSystem.B.dylib。
- 这是Apple最基本的库,它提供了数千个基础 C 函数,这些函数组成了真正的“Core OS”服务——也就是由C运行时的最低级别提供的服务,或者内核函数的包装器。
libsystem.tbd 的文本内容
- 如上图所示, dylib和许多标准的UNIX库都被实现为libSystem的符号链接。
- libSystem.B.dylib支持多种架构如 x86_64-macos, x86_64-maccatalyst, arm64-macos, arm64-maccatalyst, arm64e-macos, arm64e-maccatalyst。
- libSystem不提供任何符号和代码。它链接了/usr/lib/system中的许多其他dylibs,并将它们的符号作为自己的符号重新导出
libsystem.tbd 库的初始化入口 为 libSystem_initializer源码(from Libsystem-Libsystem-1311.120.1 的 init.c)
static void libSystem_initializer(int argc, const char* argv[], const char* envp[], const char* apple[], const struct ProgramVars* vars)
{
// 初始化libsystem_kernel 库, 处理 mach task 和 cpu 能力
__libkernel_init(&libkernel_funcs, envp, apple, vars);
_libSystem_ktrace_init_func(KERNEL);
// 初始化 libsystem_platform 库
__libplatform_init(NULL, envp, apple, vars);
_libSystem_ktrace_init_func(PLATFORM);
// 初始化 libsystem_pthread 和 pthread 功能
__pthread_init(&libpthread_funcs, envp, apple, vars);
_libSystem_ktrace_init_func(PTHREAD);
// 初始化 libc 库
_libc_initializer(&libc_funcs, envp, apple, vars);
_libSystem_ktrace_init_func(LIBC);
// 初始化 libsystem_malloc 库
__malloc_init(apple);
_libSystem_ktrace_init_func(MALLOC);
// 初始化 libkeymgr 库
#if TARGET_OS_OSX
__keymgr_initializer();
_libSystem_ktrace_init_func(KEYMGR);
#endif
// 初始化 libdyld 库
_dyld_initializer();
_libSystem_ktrace_init_func(DYLD);
// 初始化 libdispatch 库
libdispatch_init();
_libSystem_ktrace_init_func(LIBDISPATCH);
// 初始化 xpc 库
#if !TARGET_OS_DRIVERKIT
_libxpc_initializer();
_libSystem_ktrace_init_func(LIBXPC);
#endif // !TARGET_OS_DRIVERKIT
_libtrace_init();
_libSystem_ktrace_init_func(LIBTRACE);
#if !TARGET_OS_DRIVERKIT
#if defined(HAVE_SYSTEM_SECINIT)
_libsecinit_initializer();
_libSystem_ktrace_init_func(SECINIT);
#endif
#if defined(HAVE_SYSTEM_CONTAINERMANAGER)
_container_init(apple);
_libSystem_ktrace_init_func(CONTAINERMGR);
#endif
__libdarwin_init();
_libSystem_ktrace_init_func(DARWIN);
#endif // !TARGET_OS_DRIVERKIT
}
libSystem.B.dyllb 链接的库
libcache.dylib: 内存缓存支持
libcommonCrypto.dylib: 比CoreCrypto.dylib更高级的底层库
libcorecrypto.dylib: 通用密码库(在Apple中用来代替OpenSSL)
libcompiler_rt.dylib: 原子和浮点操作支持
libcopyfile.dylib: 拷贝文件的支持
libdispatch.dylib: GCD 支持
libdyld.dylib: DYLD运行时api
libkeymgr.dylib: MacOS中键/值支持
liblaunch.dylib: 遗留的vproc,引导和启动api(重定向到libxp.dylib)
libmacho.dylib: Mach-O处理api
libquarantine.dylib: MacOS隔离支持
libremovefile.dylib: Remove file支持
libsystem_asl.dylib: Apple系统日志支持(在Darwin 16中已弃用)
libsystem_blocks.dylib: C block 支持
libsystem_c.dylib: C runtime 库
libsystem_configuration.dylib: DNS、网络配置和配置接口libsystem_containermanager.dyllb: 容器管理器用户模式api libsystem_coreservices.dylib: 系统目录搜索路径和dir helper接口
libsystem_coretls.dylib: SSL/TLS的支持
libsystem_darwin.dylib: 支持os_variant查询。
libsystem_dnssd.dylib: DNS服务发现(mDNS/Bonjour)
libsystem_info.dylib: NIS和DNS服务支持
libsystem_kernel.dylib: System call 和Mach trap包装器
libsystem_m.dylib: 数学函数
libsystem_malloc.dylib: malloc, zone和调试支持
libsystem_network.dylib: 路由和其他网络支持
libsystem_notify.dylib: notify API支持
libsystem_platform.dylib: OSAtomic和优化的platform_variant
libsystem_pthread.dylib: POSIX线程支持
libsystem_sandbox.dylib: 沙盒支持
libsystem_secinit.dylib: MacOS: securityd集成
libsystem_trace.dylib: os_log
libunwind.dylib: 栈展开/回溯的支持
libxpc.dylib: XPC支持
除了libSystem的各种子库之外,还有许多其他的特定于Darwin的库,如下所示。这些都是闭源的
libafc.dylib: iOS支持Apple File Conduit (afcd)
libdscsym.dylib: 共享缓存符号函数和段迭代器
libcoreroutine.dylib: 支持/usr/libexec/routated(跟踪用户行为模式)
libenergytrace.dylib: 能量跟踪Kdebug代码的包装器
libktrace.dylib: Kdebug接口包装器(第15章)
libmis.dylib: /usr/libexec/amfid
libMobileGestalt: MobileGestalt系统信息接口
libnetwork: 基于套接字、mDNS和SSL的高级nw_*和tcp_* api
libnetworkextension.dylib: 用于网络扩展(VPN等)的api
libpmsample.dylib: 源管理采样
libpmenergy.dylib: 能量影响计算
libsandbox.1.dylib: 沙盒。kext接口
libsysdiagnose.dylib: 系统诊断(调试快照)支持
libsysmon.dylib: /usr/libexec/sysmond接口
libsystemstats.dylib: usr/sbin/systemstats接口
libtailspin.dylib: 调试快照支持
libXSEvent.dylib: MacOS:用于emond的 client 库