她可翻出指定的所支持之微机架构的履代码(机器码).这个就算叫为iOS应用程序的编译开发一个完全基于LLVM架构的工具链成为可能.而LLVM的这个编造的通用的指令集可以据此异常多种意味着格式。它可翻出指定的所支持的电脑架构的履代码(机器码).这个就算让为iOS应用程序的编译开发一个完全基于LLVM架构的工具链成为可能.而LLVM的斯虚拟的通用的指令集可以为此特别多种代表格式。

它可以翻译出指定的所支持的处理器架构的执行代码(机器码).这个就使得为iOS应用程序的编译开发一个完全基于LLVM架构的工具链成为可能.而LLVM的这个虚拟的通用的指令集可以用很多种表示格式,它可以翻译出指定的所支持的处理器架构的执行代码(机器码).这个就使得为iOS应用程序的编译开发一个完全基于LLVM架构的工具链成为可能.而LLVM的这个虚拟的通用的指令集可以用很多种表示格式

前言

召开iOS开发的情人等还掌握,目前时髦的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都吃这突如其来的bitcode功能于坑了招项目编译失败,而这些为bitcode而编译失败的底项目都发生一个共同点,就是链接了第三正值次进制的库房或者框架,而这些框架或仓库正没有包含bitcode的东西(暂且称为东西),从而导致项目编译不成为功.所以每当遇上是场面上大部分人数还是一直装Xcode关闭bitcode功能,全部无生成bitcode.也无去追就等同开关背后隐藏的原理.中枪的求点个赞.

LLVM是目前苹果应用的编译器工具链,Bitcode是LLVM编译器的中间代码的一律种编码,LLVM的前端可以解也C/C++/OC/Swift等编程语言,LLVM的后端可以知晓吧各个芯片平台达成的汇编指令或可实施机器指令数据,那么,BitCode就是位于这二者直接的高中级码.
LLVM的编译工作规律是前者负责管品种程序源代码翻译成Bitcode中间码,然后再冲不同目标机器芯片平台转换为对应的汇编指令与翻译啊机码.这样设计虽好被LLVM成为了一个编译器架构,可以轻易的于LLVM架构之上发明新的言语(前端),以及当LLVM架构下支持新的CPU(后端)指令输出,虽然Bitcode仅仅只是一个中间码不克以另外平台上运行,但是它可转化为外被支持的CPU架构,包括现尚从未给发明的CPU架构,也就是说现在打开Bitcode功能交由一个App到利用商店,以后只要苹果新发生了一样缓缓手机并CPU也是新设计的,在苹果后台服务器一样好由夫App的Bitcode开始编译转化为新CPU上的可执行程序,可供应新手机用户下载运行此App.

前言

开iOS开发的爱人等都晓得,目前时的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都深受此突如其来的bitcode功能让坑了致品种编译失败,而这些以bitcode而编译失败的的项目还起一个共同点,就是链接了第三正值次进制的库房或者框架,而这些框架或仓库正没有包含bitcode的事物(暂且称为东西),从而致使项目编译不化功.所以每当遇上是状况时大部分人数都是一直装Xcode关闭bitcode功能,全部免生成bitcode.也未错过追就等同开关背后隐藏的原理.中枪的乞求点单赞.

LLVM是当下苹果采用的编译器工具链,Bitcode是LLVM编译器的中间代码的一律种编码,LLVM的前端可以了解为C/C++/OC/Swift等编程语言,LLVM的后端可以知道呢各个芯片平台达成的汇编指令或可实施机器指令数据,那么,BitCode就是位于这二者直接的高中级码.
LLVM的编译工作规律是前者负责管品种程序源代码翻译成Bitcode中间码,然后再因不同目标机器芯片平台转换为相应的汇编指令与翻译啊机码.这样设计虽得被LLVM成为了一个编译器架构,可以不难的于LLVM架构之上发明新的语言(前端),以及在LLVM架构下支持新的CPU(后端)指令输出,虽然Bitcode仅仅只是一个中间码不能够以任何平台上运行,但是它可转化为另外被支持的CPU架构,包括现尚从来不给发明的CPU架构,也就是说现在打开Bitcode功能交由一个App到利用商店,以后要苹果新发了一样缓缓手机并CPU也是新设计的,在苹果后台服务器一样好由者App的Bitcode开始编译转化为新CPU上的可执行程序,可供应新手机用户下载运行此App.

史回顾

在iPhone出来之前,苹果要的编译器技术是为此经过多少改进的GCC工具链来将Objective-C语言编写的代码编译出所指定的机处理器上原生的可执行程序.编译器产生的可执行程序叫做”Fat
Binaries”–类似于Windows下PE格式的exe和Linux下的ELF格式的二进制,不同之凡,一个”Fat
Binary”可以分包同一个顺序的广大本,所以跟一个可执行文件可以以不同的计算机上运行.主要就是其一技能为苹果的硬件大轻之自PowerPC迁移到PowerPC64的处理器,以及后来复徙至Intel和Intel64处理器.这个方案带来的负面影响就是跟一个文件被满怀了多份而尽代码,除了当前机械而实行之那同样份之外其余还是杯水车薪的,白占空间.
这个当市面高达为名”Universal
Binary”,在苹果打PowerPC迁移至Intel处理器的工作开始有的(一个二进制文件既涵盖一客PowerPC版本和同一份Intel版本).慢慢的新生又支持而涵盖Intel
32bit和Intel 64bit. 以一个Fat
binary中,又操作系统运行时冲处理器类型动态选择正确的亚向前制版本来运行,但是应用程序要支持不同平台的处理器吧,应用程序本身若多占用部分空间.当然为出部分瘦身的家伙,比如lipo,可以据此来换除了fat
binary中那些当前机械中莫深受支持的要多余的只是尽代码达到瘦身目的,lipo不见面改变程序执行逻辑,仅仅只是文件之大小瘦身.

历史回顾

以iPhone出来前,苹果要的编译器技术是为此经过多少改进的GCC工具链来将Objective-C语言编写的代码编译出所指定的机械处理器上原生的可执行程序.编译器产生的可执行程序叫做”Fat
Binaries”–类似于Windows下PE格式的exe和Linux下的ELF格式的二进制,不同之是,一个”Fat
Binary”可以涵盖同一个序的不少本子,所以与一个可执行文件可以以不同之微机上运行.主要就是是此技能给苹果之硬件大爱的由PowerPC迁移至PowerPC64的电脑,以及新兴重徙至Intel和Intel64处理器.这个方案带来的负面影响就是跟一个文书中满怀了大多卖而实行代码,除了当前机械而实施的那么无异卖之外任何都是无用的,白占空间.
这个于商海及给称”Universal
Binary”,在苹果于PowerPC迁移到Intel处理器的事体开始在的(一个二进制文件既包含一份PowerPC版本与均等卖Intel版本).慢慢的新兴还要支持以富含Intel
32bit和Intel 64bit. 当一个Fat
binary中,又操作系统运行时根据处理器类型动态选择对的次前进制版本来运行,但是应用程序要支持不同平台的电脑吧,应用程序本身要多占用部分空间.当然为出有瘦身之家伙,比如lipo,可以用来换除了fat
binary中那些当前机械中未让支持之抑多余的不过实行代码达到瘦身目的,lipo不会见改变程序执行逻辑,仅仅只是文件的大小瘦身.

编译器现状

随着活动设备移动互联网的入木三分发展,现在运动设备中的顺序大小变换得越来越重要了,主要是因运动装备中无会见时有发生计算机上那么稀之一个硬盘驱动器.还有即使是苹果已经从旧之ARM处理器迁移到本人设计之A4,A5,A5X,A6,A7,A8,A8X,A9,A9X以及连续之A10处理器,他们的指令集已经产生了变更和原始ARM设计的有所区别,所有的这些生成还被iOS操作系统底层及Xcode/LLVM编译工具往上层程序员一定程度的透明了,编译出来的次第会含有多尽代码版本.当面对此问题后,苹果投入大量资产迁移至LLVM编译器架构并使bitcode的必要性进一步大.从不过开始的把OPENGL编译为一定的GPU指令到把Clang编译器(LLCM的C/OC编译前端)支持Objective-C的改进并作为Xcode的默认编译器.

LLVM提供了一个虚构指令集机制,它好翻出指定的所支撑之计算机架构的实践代码(机器码).这个就令为iOS应用程序的编译开发一个意基于LLVM架构的工具链成为可能.而LLVM的此编造的通用的指令集可以据此非常多种象征格式:

  • 何谓IR的文件表示的汇编格式(像汇编语言);
  • 换为二进制数据表示的格式(像目标代码),这个次前行制格式就是我们所说之bitcode.

Bitcode和人情的不过尽令集不同,他维护的是函数功能的种类以及签署,比如,传统而实行令集中,一密密麻麻(<=8)的布尔值可以减存储到么字节中,但是以bitcode中他们是分别独立表示的.此外,逻辑运算操作(比如寄存器清零操作)也鉴于他们相应之逻辑表示法($R=0);当这些BitCode要更换为一定机器平台的通令集时,他得用经过对一定机器平台优化了的汇编指令来代表:xor eax, eax.(这个汇编指令同样是寄存器<eax>清零操作).

然而bitcode他啊未是完全独立为电脑平台和调用约定的.寄存器的深浅在指令集中是一个相当关键的特色,众所周知,64bit寄存器可以较32bit寄存器存储更多之数据,生成64bit平台的bitcode和32bit平台的bitcode是强烈例外之,还有,调用约定好因函数定义或者函数调用来定义,这些可以规定函数的参数传递是传寄存器值也还是压栈.
一些编程语言还有有如sizeof(long)这样的预先处理指令,这些以于bitcode生成之前前让翻译.一般情形下,对于支撑fastcc(fast
calling convention)调用的64bit平台会转移与该同的bitcode代码.

编译器现状

随着活动设备移动互联网的入木三分发展,现在运动设备中的次大小变换得越来越重要了,主要是因运动装备中无会见发计算机上那么稀之一个硬盘驱动器.还有即使是苹果已经从老之ARM处理器迁移到我设计之A4,A5,A5X,A6,A7,A8,A8X,A9,A9X以及连续之A10处理器,他们的指令集已经产生了变更和原始ARM设计的有所区别,所有的这些生成还为iOS操作系统底层以及Xcode/LLVM编译工具往上层程序员一定程度的透明了,编译出来的程序会含有多尽代码版本.当面对此问题后,苹果投入大量资产迁移至LLVM编译器架构并以bitcode的必要性进一步大.从不过开始的把OPENGL编译为一定的GPU指令到把Clang编译器(LLCM的C/OC编译前端)支持Objective-C的改进并作为Xcode的默认编译器.

LLVM提供了一个虚拟指令集机制,它好翻出指定的所支撑之计算机架构的实践代码(机器码).这个就令为iOS应用程序的编译开发一个一心基于LLVM架构的工具链成为可能.而LLVM的此编造的通用的指令集可以据此很多种象征格式:

何谓IR的文件表示的汇编格式(像汇编语言);
易为二进制数据表示的格式(像目标代码),这个次上前制格式就是我们所说之bitcode.
Bitcode和风俗的而实施令集不同,他维护的是函数功能的类及签字,比如,传统而尽令集中,一名目繁多(<=8)的布尔值可以减小存储到么字节中,但是于bitcode中他们是各自独立表示的.此外,逻辑运算操作(比如寄存器清零操作)也出于他们相应之逻辑表示方法($R=0);当这些BitCode要转换为特定机器平台的授命集时,他好据此经过对特定机器平台优化了之汇编指令来替代:xor
eax, eax.(这个汇编指令同样是寄存器<eax>清零操作).

然而bitcode他为不是全然独立于计算机平台与调用约定的.寄存器的轻重在命令集中是一个一定重要之风味,众所周知,64bit寄存器可以较32bit寄存器存储更多之数据,生成64bit平台的bitcode和32bit平台的bitcode是显著例外的,还有,调用约定可根据函数定义或者函数调用来定义,这些足以确定函数的参数传递是传寄存器值吗还是杀栈.
一些编程语言还有局部像sizeof(long)这样的先处理指令,这些用当bitcode生成之前前为翻译.一般景象下,对于支持fastcc(fast
calling convention)调用的64bit平台会转移和该同的bitcode代码.

苹果之渴求

及是,让我们想一下,为什么苹果默认要求watchOS和tvOS的App要达到传bitcode?
因为把bitcode上传到外好之为主服务器后,他好为目标安装App的设备进行优化二进制,减多少安装包之下载大小,当然iOS开发者也得以上传多个版要休是包装到单个包里,但是这么见面占更多之囤空间.
最根本之凡允许苹果可以于后台服务器对应用程序进行签字,而不用导出任何密钥到终点开发者那.

上传到服务器的bitcode给苹果带来重新便宜是:
以后新计划了初指令集的新CPU,可以继承打这份bitcode开始编译出新CPU上实行的可执行文件,以供用户下载安装.
但是bitcode给开发者带来的孤苦的远在便是:
没用bitcode之前,当应用程序奔溃后,开发者可以依据取得之底奔溃日志再配上上传到苹果服务器的二进制文件之调试符号表信息可以过来程序运行过程到奔溃时后调整用栈信息,对题目进行固定排查.但是之所以了bitcode之后,用户安装的二进制不是开发者这边转移的,而是苹果服务器经过优化后别的,其相应的调节符号信息丢失了,也即无法展开前说之回复奔溃现场寻找原因了.

即,watchOS和tvOS应用发布得达传带bitcode版本的包.iOS应用发布针对bitcode的渴求凡可选的,用户可以Xcode的种类安装中关闭.
相当给当编译的下加一个记:embed-bitcode-marker(调试构建)
embed-bitcode(打包/真机构建).这个在clang编译器的参数是-fembed-bitcode,swift编译器的参数是-embed-bitcode.

苹果之渴求

到这个,让咱思想一下,为什么苹果默认要求watchOS和tvOS的App要上传bitcode?
因为把bitcode上传到外自己之主干服务器后,他可为目标安装App的设备进行优化二进制,减多少安装包之下载大小,当然iOS开发者也堪上传多个版要不是包到么包里,但是这么会占更多的蕴藏空间.
最重大之凡允许苹果好在后台服务器对应用程序进行签字,而非用导出任何密钥到终极开发者那.

上传到服务器的bitcode给苹果带来双重便宜是:
以后新计划了初指令集的初CPU,可以持续打当时份bitcode开始编译出新CPU上实行的可执行文件,以供用户下载安装.
唯独bitcode给开发者带来的诸多不便之处就是是:
没用bitcode之前,当应用程序奔溃后,开发者可以因取得的的奔溃日志再下放上上传到苹果服务器的二进制文件之调剂符号表信息可以过来程序运行过程到奔溃时后调用栈信息,对题目开展定点排查.但是之所以了bitcode之后,用户安装的二进制不是开发者这边转移的,而是苹果服务器经过优化后变更的,其相应的调节符号信息丢失了,也不怕无法开展前说之死灰复燃奔溃现场寻找原因了.

现阶段,watchOS和tvOS应用发布得达到传带bitcode版本的包.iOS应用发布对bitcode的求凡可选的,用户可以Xcode的品种安装中关闭.
相当给以编译的当儿加一个号:embed-bitcode-marker(调试构建)
embed-bitcode(打包/真机构建).这个在clang编译器的参数是-fembed-bitcode,swift编译器的参数是-embed-bitcode.

尽出真明

咱们要该实际施行两个测试代码进行实施和检验一下比较好.做简单糟测试,第一糟准备一定量个C语言源代码继续测试;第二潮将里面一个转移吗集编语言源代码后再行一个C代码和一个汇编代码一起还之前的测试步骤进行对照校验差异.

  • 1 . 如下两个总体凡是Objective-C代码:

test.m :

#import <Foundation/Foundation.h>
void greeting(void)
{
    NSLog(@"hello world!");
}

demo.m :

#import <Foundation/Foundation.h>
void demo(void)
{
    NSLog(@"demo func");
}

因而Clang编译成 ARM64 格式且带bitcode的靶子文件test.o demo.o:

wuqiong:~ apple$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.m

下一场将简单个目标文件包为一个静态库文件:

wuqiong:~ apple$ xcrun -sdk iphoneos ar  -r libTest.a test.o demo.o
ar: creating archive libTest.a

故Shell命令otool查看目标文件被是不是包含bitcode段:

wuqiong:~ apple$ otool -l test.o |grep bitcode
  sectname __bitcode
  sectname __bitcode

使看到输出了2行sectname __bitcode,就是认证及时静态库中的星星点点个目标文件包含了bitcode.

  • 2.脚将里面一个demo.m换成汇编语言再与编译:

故而底的命令将demo.m的C代码转换为ARM64聚集编语言格式demo.s:

wuqiong:~ apple$ xcrun -sdk iphoneos clang -arch arm64 -S demo.m
wuqiong:~ apple$ cat demo.s
    .section    __TEXT,__text,regular,pure_instructions
    .ios_version_min 9, 2
    .globl  _demo
    .align  2
_demo:                                  ; @demo
    .cfi_startproc
; BB#0:
    stp x29, x30, [sp, #-16]!
    mov  x29, sp
Ltmp0:
    .cfi_def_cfa w29, 16
Ltmp1:
    .cfi_offset w30, -8
Ltmp2:
    .cfi_offset w29, -16
    adrp    x0, L__unnamed_cfstring_@PAGE
    add x0, x0, L__unnamed_cfstring_@PAGEOFF
    bl  _NSLog
    ldp x29, x30, [sp], #16
    ret
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ; @.str
    .asciz  "demo func"

    .section    __DATA,__cfstring
    .align  4                       ; @_unnamed_cfstring_
L__unnamed_cfstring_:
    .quad   ___CFConstantStringClassReference
    .long   1992                    ; 0x7c8
    .space  4
    .quad   L_.str
    .quad   9                       ; 0x9

    .section    __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
    .long   0
    .long   0


.subsections_via_symbol

然后去demo.m这个C源代码,仅留下test.mdemo.s:

wuqiong:~ apple$ rm demo.m

现,我们来将test.m以此C源代码和dmeo.s本条集编源代码来一块带在-fembed-bitcode参数来十分成靶子代码并包为一个静态库:

wuqiong:~ apple$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.s
wuqiong:~ apple$ xcrun -sdk iphoneos ar -r libTest.a test.o demo.o

然后我们还运行otool工具来检查这个新的静态库中隐含的2个对象文件是否还带有bitcode段:

wuqiong:~ apple$ ar -t libTest.a
__.SYMDEF SORTED
test.o
demo.o
wuqiong:~ apple$ otool -l libTest.a | grep bitcode
  sectname __bitcode

万分奇怪,这同一不善,只生一行sectname __bitcode输出,这虽说明这点儿独对象文件,有一个请勿带有bitcode段,哪怕我们在编译的上指定了参数-fembed-bitcode也远非用.至于具体是啊一个勿带bitcode段,我们肯定知道就是不行由ARM64聚集编语言编译过来的对象文件不带.

那么即使得出一个定论,bitcode的别,是出于汇编语言以上之上层语言编译而来,和极致前面所说的那样,他是上层语言与汇编语言(机器语言)之间的一个中间码.

即咱们常见的iOS应用开发中,一般不会见用用到汇编层面去优化的代码.所以我们主要关心第三正在(开源)C代码,尤其是音视频编码解码这些计算密集型项目代码,关键计算的代码针对特定平台还有对承诺平台的汇编版本实现,当然也有C的实现,但是默认编译一般都是故之汇编版本,这样便会导致我们以编译这个开源代码的上就是你带来了-fembed-bitcode参数为仅仅只是让项目受到的一部分C代码的目标文件带了bitcode段,而那小数的汇编代码的目标文件一律未带bitcode段,这样编译出是库房交给上层开发者使用的时段,就会见面世在卷入上传或者真机调试之时节盖Xcode默认开了bitcode功能一旦链接失败,导致未能够真机调试要不克上传应用至AppStore.

实践产生真正懂

咱俩要应该实际搞两只测试代码进行实践与查看一下较好.做简单不好测试,第一不好准备简单单C语言源代码继续测试;第二不行将内部一个变更吗集聚编语言源代码后再行一个C代码和一个汇编代码一起重复之前的测试步骤进行比校验差异.

此文之初衷

近日于辅导自己戴维营战友们做手机音视频直播的App,调试的时手机采集音视频,视频用h264编码,音频采用aac编码,通过RTMP协和为斗鱼直播频道发布媒体流,项目需要因此FFMPEGlibx264简单单开源项目,在编译为iOS框架库提供给学生用的上,他们撞了bitcode的题目,虽然好行使直接关闭bitcode来避免不当,但是战友的求知欲要满足,格物致知,必须给那知其究竟.

libx264凡VideoLan基金会保管之一个视频编解码的开源项目,其大气用了逐条平台的多媒体汇编指令进行了优化,在编译为无带bitcode的库房的早晚,完全以官方autotools编译方法是不曾其余问题之;编译全带bitcode的库房的时我们不得不关门汇编优化,在实行./configure等级可以长--disable-asm参数来经用汇编.但是,这个选项在configure剧本中之落实机制来题目.导致其还调用了汇编的函数,但是汇编的代码却绝非编译进去,从而会导致项目也确实机构建与包装的链接阶段会暴露找不至号的不当,这样即便非可知得少全其美.出于轻微程度之强迫症影响,故将前面的FFMPEGlibx264路的编译脚本进行了改良与打补丁.时早已可以好一键编译出带全部bitcode的FFMPEG和libx264底框架了.

FFmpeg要依靠libx264.

机关编译脚本项目位置在github:
https://github.com/Diveinedu-CN/FFmpeg-iOS-build-script.git

出于时间及字数由,关于任何还多详细的消息就是非苗条道来了.

戴维营教育Slogan: Dive in education!

再也多iOS开发精品文章:戴维营技术博客

1 . 如下两独不折不扣凡是Objective-C代码:

test.m :

#import <Foundation/Foundation.h>
void greeting(void)
{
    NSLog(@"hello world!");
}

demo.m :

#import <Foundation/Foundation.h>
void demo(void)
{
    NSLog(@"demo func");
}

之所以Clang编译成 ARM64 格式且带bitcode的靶子文件test.o demo.o:

$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.m

下一场把有限独目标文件包为一个静态库文件:

$ xcrun -sdk iphoneos ar  -r libTest.a test.o demo.o
# ar: creating archive libTest.a

故此Shell命令otool查看目标文件被是不是包含bitcode段:

$ otool -l test.o |grep bitcode
# Prints:
#   sectname __bitcode
#   sectname __bitcode

假如看到输出了2行sectname
__bitcode,就是认证这静态库中的星星独对象文件包含了bitcode.

2.下将里面一个demo.m换成汇编语言再参与编译:

所以底的下令将demo.m的C代码转换为ARM64凑合编语言格式demo.s:

$ xcrun -sdk iphoneos clang -arch arm64 -S demo.m
$ cat demo.s
# Prints:
    .section    __TEXT,__text,regular,pure_instructions
    .ios_version_min 9, 2
    .globl    _demo
    .align    2
_demo:                                  ; @demo
    .cfi_startproc
; BB#0:
    stp    x29, x30, [sp, #-16]!
    mov     x29, sp
Ltmp0:
    .cfi_def_cfa w29, 16
Ltmp1:
    .cfi_offset w30, -8
Ltmp2:
    .cfi_offset w29, -16
    adrp    x0, L__unnamed_cfstring_@PAGE
    add    x0, x0, L__unnamed_cfstring_@PAGEOFF
    bl    _NSLog
    ldp    x29, x30, [sp], #16
    ret
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ; @.str
    .asciz    "demo func"

    .section    __DATA,__cfstring
    .align    4                       ; @_unnamed_cfstring_
L__unnamed_cfstring_:
    .quad    ___CFConstantStringClassReference
    .long    1992                    ; 0x7c8
    .space    4
    .quad    L_.str
    .quad    9                       ; 0x9

    .section    __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
    .long    0
    .long    0
    .subsections_via_symbol

然后去demo.m这个C源代码,仅留test.m和demo.s:

$ rm demo.m

本,我们来拿test.m这个C源代码和dmeo.s这个集编源代码来一同带在-fembed-bitcode参数来挺成靶子代码并封装为一个静态库:

$ xcrun -sdk iphoneos clang -arch arm64 -fembed-bitcode -c test.m demo.s
$ xcrun -sdk iphoneos ar -r libTest.a test.o demo.o

下一场我们再次运行otool工具来检查是新的静态库中包含的2只目标文件是否还带有bitcode段:

$ ar -t libTest.a
# Prints:
# __.SYMDEF SORTED
# test.o
# demo.o
$ otool -l libTest.a | grep bitcode
# Prints:
#  sectname __bitcode

死意外,这等同次等,只发一行sectname
__bitcode输出,这即说明及时简单只目标文件,有一个无带有bitcode段,哪怕我们以编译的时节指定了参数-fembed-bitcode也从没用.至于具体是啦一个免带bitcode段,我们终将晓得就是大起ARM64集聚编语言编译过来的靶子文件未带.

那就算查获一个结论,bitcode的生成,是由汇编语言以上的上层语言编译而来,和最前方所说之那么,他是上层语言及汇编语言(机器语言)之间的一个中级码.

现阶段咱们便的iOS应用开发中,一般不见面得为此到汇编层面去优化的代码.所以我们最主要关心第三着(开源)C代码,尤其是音视频编码解码这些计算密集型项目代码,关键计算的代码针对特定平台都生对许平台的汇编版本实现,当然也起C的实现,但是默认编译一般都是故底汇编版本,这样就算见面招致我们以编译这个开源代码的早晚就是你带来了-fembed-bitcode参数为仅仅只是让色被之有些C代码的靶子文件带了bitcode段,而那小数的汇编代码的目标文件一律未带bitcode段,这样编译出这个库房交给上层开发者使用的时节,就会面世在包上传或者真机调试之当儿因Xcode默认开了bitcode功能一旦链接失败,导致不能够真机调试要无克上传应用及AppStore.

此文之初衷

近日于辅导自己戴维营战友们开手机音视频直播的App,调试的时手机采集音视频,视频用h264编码,音频采用aac编码,通过RTMP协议为斗鱼直播频道发布媒体流,项目要用FFMPEG和libx264点滴个开源项目,在编译为iOS框架库提供于学员因此底时,他们遇到了bitcode的题材,虽然可以运用直接关闭bitcode来避免不当,但是战友的求知欲要满足,格物致知,必须为那个知其究竟.

libx264凡VideoLan基金会保管的一个视频编解码的开源项目,其大气下了逐条平台的多媒体汇编指令进行了优化,在编译为非带bitcode的库房的上,完全本官方autotools编译方法是从来不其他问题之;编译全带bitcode的库房的时候我们只好关门汇编优化,在执行./configure阶段可以增长–disable-asm参数来经用汇编.但是,这个选项在configure脚本中之落实机制发生题目.导致其依然调用了汇编的函数,但是汇编的代码却绝非编译进去,从而会导致项目也确实机构建与包装的链接阶段会暴露找不至号的不当,这样就非可知得少皆其美.出于轻微程度之强迫症影响,故将前面的FFMPEG和libx264类之编译脚本进行了改善与打补丁.时曾经好成功一键编译出带全部bitcode的FFMPEG和libx264之框架了.

FFmpeg需要依赖libx264.

机关编译脚本项目位置在github:
https://github.com/Diveinedu-CN/FFmpeg-iOS-build-script.git

由岁月及字数由,关于任何还多详细的消息就是不细道来了.