3

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

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

我们在 Linux 11.10 上使用 NDK r8d。

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

谢谢!

4

1 回答 1

2

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

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

此外,visibilityGCC 中的功能也会有所帮助。 http://gcc.gnu.org/wiki/Visibility

于 2013-03-14T05:12:05.943 回答