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

时间:2013-03-14 00:31:14

标签: android gcc android-ndk native

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

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

我们在Linux 11.10上使用NDK r8d。

是否有任何特定的编译器/链接器标志需要应用于Android.mk才能删除死代码?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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