Android的静态链接VS针对glibc的动态链接(Android Static Linking

2019-06-24 01:43发布

我一直在交叉编译一些Linux工具(和一些我自己的C代码),Android和一个的,我面对的是Android的libc中有一些缺失/剥离组件和我结束了修补我的代码,使其与工作所面临的挑战Android的libc的(例如对于这样的问题http://credentiality2.blogspot.com/2010/08/compile-ncurses-for-android.html )

Q1:我如何去静态链接的glibc(以及其他依赖的),而用手臂工具链(或NDK建造)交叉编译?

Q2:这是个好主意,静态的是glibc链接以二进制为Android? 我应该期望什么突破,如果我开始静态链接? 是否有任何性能/内存问题?

据我所知大部分的静态VS动态链接的利弊从这里- C ++应用程序-我应该使用静态或动态链接的库? 和静态链接VS动态链接

所以,我想知道我是否应该静态链接glibc的为Android在交叉编译的二进制文件。

Answer 1:

首先在libc的小纸条。 而Android的libc是仿生的libc( https://github.com/android/platform_bionic/ )而不是GNU库(glibc的)。 因此包含在NDK libc中是仿生,因为是在机器人设备上使用的libc。

至于glibc的来讲,它是可能的NDK来构建它。 然而,这在Android设备上安装时的名字将与系统的libc冲突。 请注意,这只是如果你去构建一个动态库。 如果构建了GNU libc中的静态库,那么上面的整个问题是回避,因为你永远需要安装一个静态库。

现在回答你的问题:

  1. Q1:如果您正在构建使用NDK glibc的,那么Android.mk使用变量BUILD_STATIC_LIBRARY建立静态库。 但是,如果你不使用NDK,那么你可能需要进入的很多头疼的(不知道多少)。 我不能告诉你更多关于这个,因为我还没有尝试过的glibc的构建,无论是静态还是动态的。 此外,它似乎是用glibc静态链接非常气馁,在 - 至少对于非移动平台。

  2. 从破损的观点,有静态和动态链接没有什么区别。 从初创角度来看,静态可执行文件,因为不需要加载步骤动态库启动更快。 有一个在静态或动态链接可执行没有记忆或执行速度罚款。 磁盘存储的要求是静态的可执行文件较大。

至于与仿生libc中缺少的功能方面的问题,您可以使用由大多数GNU软件,它使用的方法,自己实现的情况下,它是从系统库中缺少的功能。 我编译的文件5.11,GNU使3.82,diffutils的-2.8的Android传递NDK工具链/包括/库来自动工具时(./configure ...)。 看来,这些程序包含了大部分非核心库函数的实现,如果标准库不提供他们(在这种情况下仿生)。

注:我会试着建立一个静态的glibc和更新的答案,当我成功/失败。



Answer 2:

如果你要使用的glibc,而不是仿生,它可能是值得探讨使用(兼容内核代)的工具链在arm-linux的发行版,而不是NDK。 如果你是一个生成可执行命令行这尤其是真实的。 (人们已经用实验在Android设备上猛的chroot Debian的环境中一路回G1)

对于JNI子(这是唯一正式批准的车辆为本地应用程序代码)就可以得到一点“有趣”与任一工具链,你会在一个已经映射到一个进程中运行,并且正在持续使用仿生libc中的支持Dalvik虚拟机。 据推测,如果静态链接库的自己的依赖,你不会遇到名称冲突,但我希望你选择的路径,这将是对内部工作学习经验 - 不,那一定是一件坏事。

你有让ncurses? 我成功地建立了诅咒与NDK一次机器人。 还要考虑如果程序严重还能利用(即,你实际上做大量的文本格式?),或者只是使用它的一些小东西,因为它被假定为可在目标系统上?



文章来源: Android Static Linking vs Dynamic Linking against glibc