我们注意到一些死函数没有从生成的共享对象文件 (.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/