gpt4 book ai didi

android - 我们可以为 android-ndk r10c 中的共享库启用 pie(即位置独立可执行文件)吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:21 25 4
gpt4 key购买 nike

我们可以为 android-ndk r10c 中的共享库启用 pie(即位置独立可执行文件)吗?如果是,那么该怎么做?

我读到我们应该为动态库使用 PIC,为可执行文件使用 PIE,但看起来 android NDK 不支持 PIC。

我尝试在 LDFLAGS 中启用 -pie 标志,但出现以下错误:

/android-ndk-r10c/platforms/android-19/arch-arm/usr/lib/crtbegin_dynamic.o:
in function _start:crtbrand.c(.text+0x8c): error: undefined reference to 'main'

请帮助我解决这个问题,因为我了解到谷歌将在即将推出的 Android 版本中强制使用 PIE,因此我希望我的应用与 ANDROID-L+ 兼容。

最佳答案

简而言之,如果您要构建共享库(而不是可执行文件),则无需执行任何操作。在旧版本的 android 上运行的库将继续正常工作 - Android 5.0 对此没有任何改变。

简而言之,如果您使用 Android.mk 构建可执行文件并针对 Android 4.1+,则应该已经自动添加了必要的标志。

完整故事:当您尝试将 -pie 标志添加到库的 LDFLAGS 时失败的原因是该标志仅适用于可执行文件,不适用于库。构建共享库时,某些架构可能需要编译器标志 -fPIC(构建单独的目标文件时,如果手动运行编译器 - Android.mk 和 ndk-build 会自动处理此问题),但是您会注意到它是必需的,因为链接器将拒绝生成共享库(如果需要并且您尚未设置)。因此,如果您遇到问题,您将已经知道,因为它无法构建 - 如果您已成功构建它,您就没有任何问题。

同样在构建可执行文件时,您需要在构建目标文件时添加-fPIE,在链接可执行文件时添加-fPIE -pie。如果您的 APP_PLATFORM 是 android-16 (Android 4.1) 或更高版本,Android.mk 和 ndk-build 将自动处理此问题。这是一个大陷阱 - 使用 -pie 构建的可执行文件只能在 android-16 或更高版本上运行,而没有 -pie 构建的可执行文件将无法在 android-21 上运行(Android 5.0).所以这里有一个宽限期,Android 4.1 到 4.4 可以很好地运行任何可执行文件,而您明确需要一个没有 -pie 的版本用于旧版本,另一个版本有 -pie 对于较新的。

如果您还需要针对 4.1 之前的 Android 版本,请参阅 https://stackoverflow.com/a/26422855/3115956有关如何轻松构建可执行文件的两个版本的说明。

关于android - 我们可以为 android-ndk r10c 中的共享库启用 pie(即位置独立可执行文件)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27033493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com