2010-08-29 71 views
5

我有一个静态库,它包含一些JNICALL函数,即它们需要从JVM调用,并且永远不会被链接静态库的共享库引用。如何防止某些功能被剥离?

但是,函数剥离似乎是消灭了JNICALL函数(它在arm-eabi-objdump -t中不可见)。我正在通过添加一个具有调用JNICALL函数的不可能条件的虚拟函数来解决它,但这很脏。我知道有一个链接选项可以防止某些模块获取未使用的数据,但它是什么?我该如何在.mk文件中指定该选项?在arm-eabi-ld中我没有看到任何明显的东西。

顺便提一句,函数剥离并不会去除共享库本身中的JNICALL函数,但它会从共享库链接的静态库中删除这些函数。这是什么原因?

+1

This just came up - http://stackoverflow.com/questions/3549432/preventing-functions-from-being-stripped-from-a-static-library-when-linked-into-a/3559733#3559733 – fadden 2010-08-30 21:54:08

+0

当然,这是我的个人回答家伙:),想发布这个问题作为一个问题,我可以接受它吗? (那么,或者我可以关闭我自己的问题作为一个骗局) – EboMike 2010-08-31 05:50:46

回答

5

它实际上看起来像NDK团队开始支持(或停止?),并且在构建系统中有它的痕迹,但是一些关键部分丢失了。好消息是它可以很容易实现。

转到NDK安装中的“build”目录并搜索LOCAL_STATIC_LIBRARIES的所有实例。复制并粘贴所有这些文件,并添加一个与LOCAL_STATIC_WHOLE_LIBRARIES执行相同操作的版本。

准确地说:在构建/核心/ build-binary.mk,你将需要:

LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES)) 
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES)) 
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES)) 
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES)) 

[...]

$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries) 

[...]

$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries) 
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries) 

注STATIC_WHOLE和WHOLE_STATIC之间的差异 - 这是它是如何在NDK,我选择保持它,即使它是不一致的方式。

现在,最后在build/toolchains/arm-eabi-4.4.0/setup.mk中:已经有共享库的PRIVATE_WHOLE_STATIC_LIBRARIES块。您也可以选择将其添加到可执行文件中,尽管这很可能不是必需的。

1

请参阅the other question

+0

谢谢!当我寻找答案时,我没有看到。我会在另一个线程上重复我的问题 - 你能发表一个关于如何设置Android.mk文件的简单例子(至少有两行与链接相关)? – EboMike 2010-08-31 19:19:20

+0

我在其他问题中添加了一条注释。我不知道在NDK构建系统中应该做什么,但是如果它像一般的Android构建文件一样工作,您可以将标记添加到LOCAL_LDFLAGS。 – fadden 2010-08-31 21:48:56