深深明iOS开发被的BitCode功能。关于苹果Xcode编译器与Bitcode

前言

开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命澳门xinpujing令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

出于岁月及字数由,关于其他更多详细的音信就是未苗条道来了.

相关文章

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注