android - 死函数不会从 Android NDK 构建的共享对象中删除

标签 android gcc android-ndk native

我们注意到一些死函数没有从生成的共享对象文件 (.so) 中删除,该文件是作为发布构建的(通过不带任何参数的“ndk-build”)。

为了证明我们引入了一个绝对不会在任何地方调用的虚拟函数(并且也不会导出,因为整个 .so 的默认可见性已经设置为“隐藏”)。不知何故,虚拟函数的符号仍然存在,我们可以通过对生成的 .so 使用“nm”来查看它。

我们在 Linux 11.10 上使用 NDK r8d。

我们是否需要将任何特定的编译器/链接器标志应用到 Android.mk 以删除无效代码?

谢谢!

最佳答案

删除死函数也可以大大减少二进制文件的大小。为此,更改 C 和 C++ 编译标志以及 Android.mk 中的链接器标志。

LOCAL_CPPFLAGS += -ffunction-sections -fdata-sections
LOCAL_CFLAGS += -ffunction-sections -fdata-sections 
LOCAL_LDFLAGS += -Wl,--gc-sections

此外,GCC 中的visibility 特性也能提供帮助。 http://gcc.gnu.org/wiki/Visibility

关于android - 死函数不会从 Android NDK 构建的共享对象中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15399113/

相关文章:

android - 以 tail -f 方式实时监视/开发文件

android - 相机ISO设置/快门速度

android - 在只有 2 列的 TableRow 中设置 3 个 TextView - Android

Android,如何将 ArrayList<myObject> 放入 Intent 中?

c - 是否可以恢复单链表的头指针?

java - 使用 ndk-build 从 Android 库项目链接到共享库

android - arm-linux-androideabi-gcc : Internal error: Killed (program cc1) from Android NDK r8

c++ - 试图诊断C++标准for循环之间的差异并累积副作用

c++ - 遵循 Lynda.com c++ 教程并在 Eclipse (OSX 10.9.3) 上设置路径时遇到问题

android - 在 Android 上使用 NDK 的位图无限制堆内存库