区块链技术博客
www.b2bchain.cn

百度一面总结求职学习资料

本文介绍了百度一面总结求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

  • 1. 二进制重排
    • 1.1 clang 插桩具体如何做的
    • 1.2 c++ 方法 clang 插桩能否取到?
    • 1.3 除了二进制重排,还有哪些启动优化的方法
      • 1.3.1 pre main 阶段
      • 1.3.2 main 阶段
    • 1.4 link map数据结构
      • 1.4.1 linkMapfile 的组成

1. 二进制重排

1.1 clang 插桩具体如何做的

1.2 c++ 方法 clang 插桩能否取到?

不能
可以取到 c 函数,oc 方法,blockswift 方法
但是可以用 -finstrument-functions 在编译期插桩 “hook”,或者使用并不完美但成本最低的静态扫描方案。

1.3 除了二进制重排,还有哪些启动优化的方法

1.3.1 pre main 阶段

  1. Load dylibs
  • 尽量不使用内嵌(embedded)的 dylib,加载内嵌 dylib 性能开销较大
  • 合并已有的 dylib 和使用静态库(static archives),减少 dylib 的使用个数
  • 懒加载 dylib,但是要注意 dlopen() 可能造成一些问题,且实际上懒加载做的工作会更多
  1. Rebase/Bind

dylib 的加载过程中,系统为了安全考虑,引入了 ASLR(Address Space Layout Randomization)技术和代码签名。由于ASLR的存在,镜像(Image,包括可执行文件、dylibbundle)会在随机的地址上加载,和之前指针指向的地址(preferred_address)会有一个偏差(slide),dyld需要修正这个偏差,来指向正确的地址。

  • 减少 ObjC 类(class)、方法(selector)、分类(category)的数量
  • 减少 C++ 虚函数的数量(创建虚函数表有开销)
  • 使用 swiftStructs (内部有优化,符号数量更少)
  1. Objc setUp
  2. Initializers
  • 少在类的 +load方法里做事情,尽量把这些事情推迟到 +initiailize
  • 减少构造器函数个数,在构造器函数里少做些事情
  • 减少 C++ 静态全局变量的个数

1.3.2 main 阶段

  1. 梳理各个二方/三方库,找到可以延迟加载的库,做延迟加载处理,比如放到首页控制器或 tabBar 控制器的 viewDidAppear 方法里,并且保证只执行一次(按项目结构,放在合适的地方)
  2. 梳理业务逻辑,把可以延迟执行的逻辑,做延迟执行处理。比如检查新版本、注册推送通知等逻辑。
  3. 避免复杂/多余的计算。
  4. 避免在用户看到的第一个界面(首页控制器或注册登录页面)的 viewDidLoadviewWillAppear 做太多事情,这 2 个方法执行完,第一个页面才能显示,部分可以延迟创建的视图应做延迟创建/懒加载处理
  5. 首页控制器或注册登录页面用纯代码方式来构建

1.4 link map数据结构

Link Map File 中文直译为链接映射文件,它是在 Xcode 生成可执行文件的同时生成的链接信息文件,用于描述可执行文件的构造部分,包括了代码段和数据段的分布情况

1.4.1 linkMapfile 的组成

  1. PathPath 是生成可执行文件的路径。
  2. ArchArch 指代架构类型。
  3. Object filesObject Files 列举了可执行文件里所有的 obj 以及 tbd。每一行代表对文件的编号。
  4. Sections: 每个 Section 包含了 AddressSizeSegment 以及 SectionMach-O 文件中的虚拟地址最终会被映射到物理地址上,这些地址会被分为不同的段类型: TEXTDATA 以及 LINKEDIT 等。各个段的含义如下:

TEXT 包含了被执行的代码。这些代码是只读、可执行
DATA 包含了包含了将会被更改的数据,例如全局变量、静态变量等,可读写,但是不可执行
LINKEDIT 包含了加载程序的元数据,比如函数名称和地址,只读。
Segment 又被划分成了不同的 Section,不同的 Section 存储了不同的信息,例如 objc _ methname 为方法的名称

  1. Symbols :Symbols包含的信息有:
  • Address:起始地址
  • Size:所占内存大小,这里使用16进制表示。
  • File:该Name所在的文件编号,也就是Object files部分的中括号的数字。
  1. Dead Stripped Symbols
  • 1. 二进制重排
    • 1.1 clang 插桩具体如何做的
    • 1.2 c++ 方法 clang 插桩能否取到?
    • 1.3 除了二进制重排,还有哪些启动优化的方法
      • 1.3.1 pre main 阶段
      • 1.3.2 main 阶段
    • 1.4 link map数据结构
      • 1.4.1 linkMapfile 的组成

1. 二进制重排

1.1 clang 插桩具体如何做的

1.2 c++ 方法 clang 插桩能否取到?

不能
可以取到 c 函数,oc 方法,blockswift 方法
但是可以用 -finstrument-functions 在编译期插桩 “hook”,或者使用并不完美但成本最低的静态扫描方案。

1.3 除了二进制重排,还有哪些启动优化的方法

1.3.1 pre main 阶段

  1. Load dylibs
  • 尽量不使用内嵌(embedded)的 dylib,加载内嵌 dylib 性能开销较大
  • 合并已有的 dylib 和使用静态库(static archives),减少 dylib 的使用个数
  • 懒加载 dylib,但是要注意 dlopen() 可能造成一些问题,且实际上懒加载做的工作会更多
  1. Rebase/Bind

dylib 的加载过程中,系统为了安全考虑,引入了 ASLR(Address Space Layout Randomization)技术和代码签名。由于ASLR的存在,镜像(Image,包括可执行文件、dylibbundle)会在随机的地址上加载,和之前指针指向的地址(preferred_address)会有一个偏差(slide),dyld需要修正这个偏差,来指向正确的地址。

  • 减少 ObjC 类(class)、方法(selector)、分类(category)的数量
  • 减少 C++ 虚函数的数量(创建虚函数表有开销)
  • 使用 swiftStructs (内部有优化,符号数量更少)
  1. Objc setUp
  2. Initializers
  • 少在类的 +load方法里做事情,尽量把这些事情推迟到 +initiailize
  • 减少构造器函数个数,在构造器函数里少做些事情
  • 减少 C++ 静态全局变量的个数

1.3.2 main 阶段

  1. 梳理各个二方/三方库,找到可以延迟加载的库,做延迟加载处理,比如放到首页控制器或 tabBar 控制器的 viewDidAppear 方法里,并且保证只执行一次(按项目结构,放在合适的地方)
  2. 梳理业务逻辑,把可以延迟执行的逻辑,做延迟执行处理。比如检查新版本、注册推送通知等逻辑。
  3. 避免复杂/多余的计算。
  4. 避免在用户看到的第一个界面(首页控制器或注册登录页面)的 viewDidLoadviewWillAppear 做太多事情,这 2 个方法执行完,第一个页面才能显示,部分可以延迟创建的视图应做延迟创建/懒加载处理
  5. 首页控制器或注册登录页面用纯代码方式来构建

1.4 link map数据结构

Link Map File 中文直译为链接映射文件,它是在 Xcode 生成可执行文件的同时生成的链接信息文件,用于描述可执行文件的构造部分,包括了代码段和数据段的分布情况

1.4.1 linkMapfile 的组成

  1. PathPath 是生成可执行文件的路径。
  2. ArchArch 指代架构类型。
  3. Object filesObject Files 列举了可执行文件里所有的 obj 以及 tbd。每一行代表对文件的编号。
  4. Sections: 每个 Section 包含了 AddressSizeSegment 以及 SectionMach-O 文件中的虚拟地址最终会被映射到物理地址上,这些地址会被分为不同的段类型: TEXTDATA 以及 LINKEDIT 等。各个段的含义如下:

TEXT 包含了被执行的代码。这些代码是只读、可执行
DATA 包含了包含了将会被更改的数据,例如全局变量、静态变量等,可读写,但是不可执行
LINKEDIT 包含了加载程序的元数据,比如函数名称和地址,只读。
Segment 又被划分成了不同的 Section,不同的 Section 存储了不同的信息,例如 objc _ methname 为方法的名称

  1. Symbols :Symbols包含的信息有:
  • Address:起始地址
  • Size:所占内存大小,这里使用16进制表示。
  • File:该Name所在的文件编号,也就是Object files部分的中括号的数字。
  1. Dead Stripped Symbols
  • 1. 二进制重排
    • 1.1 clang 插桩具体如何做的
    • 1.2 c++ 方法 clang 插桩能否取到?
    • 1.3 除了二进制重排,还有哪些启动优化的方法
      • 1.3.1 pre main 阶段
      • 1.3.2 main 阶段
    • 1.4 link map数据结构
      • 1.4.1 linkMapfile 的组成

1. 二进制重排

1.1 clang 插桩具体如何做的

1.2 c++ 方法 clang 插桩能否取到?

不能
可以取到 c 函数,oc 方法,blockswift 方法
但是可以用 -finstrument-functions 在编译期插桩 “hook”,或者使用并不完美但成本最低的静态扫描方案。

1.3 除了二进制重排,还有哪些启动优化的方法

1.3.1 pre main 阶段

  1. Load dylibs
  • 尽量不使用内嵌(embedded)的 dylib,加载内嵌 dylib 性能开销较大
  • 合并已有的 dylib 和使用静态库(static archives),减少 dylib 的使用个数
  • 懒加载 dylib,但是要注意 dlopen() 可能造成一些问题,且实际上懒加载做的工作会更多
  1. Rebase/Bind

dylib 的加载过程中,系统为了安全考虑,引入了 ASLR(Address Space Layout Randomization)技术和代码签名。由于ASLR的存在,镜像(Image,包括可执行文件、dylibbundle)会在随机的地址上加载,和之前指针指向的地址(preferred_address)会有一个偏差(slide),dyld需要修正这个偏差,来指向正确的地址。

  • 减少 ObjC 类(class)、方法(selector)、分类(category)的数量
  • 减少 C++ 虚函数的数量(创建虚函数表有开销)
  • 使用 swiftStructs (内部有优化,符号数量更少)
  1. Objc setUp
  2. Initializers
  • 少在类的 +load方法里做事情,尽量把这些事情推迟到 +initiailize
  • 减少构造器函数个数,在构造器函数里少做些事情
  • 减少 C++ 静态全局变量的个数

1.3.2 main 阶段

  1. 梳理各个二方/三方库,找到可以延迟加载的库,做延迟加载处理,比如放到首页控制器或 tabBar 控制器的 viewDidAppear 方法里,并且保证只执行一次(按项目结构,放在合适的地方)
  2. 梳理业务逻辑,把可以延迟执行的逻辑,做延迟执行处理。比如检查新版本、注册推送通知等逻辑。
  3. 避免复杂/多余的计算。
  4. 避免在用户看到的第一个界面(首页控制器或注册登录页面)的 viewDidLoadviewWillAppear 做太多事情,这 2 个方法执行完,第一个页面才能显示,部分可以延迟创建的视图应做延迟创建/懒加载处理
  5. 首页控制器或注册登录页面用纯代码方式来构建

1.4 link map数据结构

Link Map File 中文直译为链接映射文件,它是在 Xcode 生成可执行文件的同时生成的链接信息文件,用于描述可执行文件的构造部分,包括了代码段和数据段的分布情况

1.4.1 linkMapfile 的组成

  1. PathPath 是生成可执行文件的路径。
  2. ArchArch 指代架构类型。
  3. Object filesObject Files 列举了可执行文件里所有的 obj 以及 tbd。每一行代表对文件的编号。
  4. Sections: 每个 Section 包含了 AddressSizeSegment 以及 SectionMach-O 文件中的虚拟地址最终会被映射到物理地址上,这些地址会被分为不同的段类型: TEXTDATA 以及 LINKEDIT 等。各个段的含义如下:

TEXT 包含了被执行的代码。这些代码是只读、可执行
DATA 包含了包含了将会被更改的数据,例如全局变量、静态变量等,可读写,但是不可执行
LINKEDIT 包含了加载程序的元数据,比如函数名称和地址,只读。
Segment 又被划分成了不同的 Section,不同的 Section 存储了不同的信息,例如 objc _ methname 为方法的名称

  1. Symbols :Symbols包含的信息有:
  • Address:起始地址
  • Size:所占内存大小,这里使用16进制表示。
  • File:该Name所在的文件编号,也就是Object files部分的中括号的数字。
  1. Dead Stripped Symbols

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 百度一面总结求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们