美文网首页程序的加载与链接
程序的加载与链接(五) 静态库链接

程序的加载与链接(五) 静态库链接

作者: 狼性刀锋 | 来源:发表于2019-11-03 10:44 被阅读0次

前面我们已经了解到了多个点.o文件是怎么链接的,今天关注一下静态库的结构和链接的过程。
先写个简单的静态库

// DemoFramework.h
#import <Foundation/Foundation.h>

@interface DemoFramework : NSObject

@end

// DemoFramework.m
#import "DemoFramework.h"

@implementation DemoFramework


- (void)codingLife {
    NSLog(@"codingLife");
}

@end

// GoodBoy.h
#import <Foundation/Foundation.h>



@interface GoodBoy : NSObject
- (void)xuanGao;
@end

// GoodBoy.m
#import "GoodBoy.h"

@implementation GoodBoy


- (void)xuanGao {
    NSLog(@"落叶方知秋");
}

@end


好了编译一下生成.a文件,MachOView ,查看一下.a文件

屏幕快照 2019-10-30 上午11.02.30.png

这里可以看到有两个对应.o文件,

  • start : !<arch>\n 类似于魔书,这样人家就知道这是一个.a文件使用.a文件的结构解析它

  • SymTab Header: 符号表头部

    • size: 符号表的大小
  • Symbol Tabel: 符号表 ,这里的符号表只暴露了一些类的符号表,细节的符号表藏在.o文件中

  • Object header : .o文件头部信息

  • .o 文件

  • MachOView 会crash,记得把修改UI的操作调用到主线程即可,也可以选择命令行工具

现在尝试使用一下这个.a文件

#import "ViewController.h"
#import "GoodBoy.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [[GoodBoy new] xuanGao];

}


@end

这里只import "GoodBoy.h" 以及使用GoodBoy Class。 使用Hopper Disassembler查看一下app执行文件

屏幕快照 2019-10-30 上午11.07.02.png

这里可以看到
[GoodBoy xuanGao] 符号,却找不到 [DemoFramework codingLife] 符号,所以推测在链接时候DemoFramework.o文件并没有链接进入执行文件.
修改一下code

#import "ViewController.h"
#import "GoodBoy.h"
#import "DemoFramework.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [[GoodBoy new] xuanGao];

}


再次反汇编执行文件发现同样的结果,可见import 不会对最终结果产生影响

再次修改code,这次开始使用DemoFramework 对象

#import "ViewController.h"
#import "GoodBoy.h"
#import "DemoFramework.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [[GoodBoy new] xuanGao];
   NSLog(@"%@",[DemoFramework new]);
}


@end


再观察一下,这次可以找到codingLife的符号表


屏幕快照 2019-10-30 上午11.13.58.png

结论: 静态库是一系列.o文件的集合,只有被执行文件所使用的.o文件才会最终绑定到执行文件上面。这么做有利于减少执行文件的大小。

: 可以观察最后执行文件的大小得到同样的结果。

相关文章

  • 程序的加载与链接(五) 静态库链接

    前面我们已经了解到了多个点.o文件是怎么链接的,今天关注一下静态库的结构和链接的过程。先写个简单的静态库 好了编译...

  • chap 7

    1. 静态链接;加载时共享库的动态链接;运行时共享库的动态链接。 2. 预编译 编译 汇编 链接 加载...

  • 运行循环- Runloop

    程序启动的原理和过程 start -> (加载framework,动态静态链接库,启动图片,Info.plist等...

  • 静态库和共享库

    1、静态库 静态库就是一些目标文件的集合,以.a结尾。静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码...

  • 动态库和静态库的区别

    函数库分为静态库和动态库两种。 静态库:即静态链接库。以.a 为文件后缀名。在程序编译时会被链接到目标代码中,程序...

  • IOS探究App加载过程

    静态库(1)类型:.a .lib(2) 加载时机:在链接阶段会将汇编生产的目标与饮用的库一起链接打包到可执行文...

  • 浅谈地址无关代码

    一、程序的加载与链接 1.1 静态链接与动态链接 程序的代码基本上不可能全部在一个源文件中实现。例如以最经典的he...

  • iOS静态库的链接与加载

    引言:研究iOS静态库的链接与加载是源自这个问题:为何引用同一个SDK,在真机可以编译成功,而在模拟器在出现dup...

  • 应用程序加载

    应用程序加载原理库:可执行的二进制文件,加载到内存文件类型:静态库 .a动态库 .so .dll两者是链接的区别 ...

  • iOS-静态库&动态库-Embed&Sign

    1、静态库&动态库 1.1 库介绍 程序的run流程:编译->链接->生成可执行文件->运行(加载可执行文件&动态...

网友评论

    本文标题:程序的加载与链接(五) 静态库链接

    本文链接:https://www.haomeiwen.com/subject/fyhovctx.html