【问题标题】:How do I prevent certain functions from getting stripped?如何防止某些功能被剥夺?
【发布时间】:2010-08-29 03:05:53
【问题描述】:

我有一个包含一些 JNICALL 函数的静态库,即它们应该从 JVM 调用,并且永远不会被链接静态库的共享库引用。

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

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

【问题讨论】:

  • 这个刚刚出现——stackoverflow.com/questions/3549432/…
  • 当然,这很流行,我个人的回答者 :) 想将其作为问题发布以便我接受吗? (嗯,那个,或者我可以把我自己的问题当作一个骗子来结束)

标签: android android-ndk


【解决方案1】:

实际上看起来 NDK 团队开始支持(或停止?),并且在构建系统中有它的痕迹,但缺少一些重要部分。好消息是它很容易实现。

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

准确地说:在 build/core/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 块。您也可以选择为可执行文件添加它,尽管这很可能不是必需的。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 谢谢!我在寻找答案时没有看到这一点。不过,我将在另一个线程上重复我的问题 - 您能否发布一个快速示例,说明您需要如何设置 Android.mk 文件(至少与链接相关的两行)?
    • 我在另一个问题上添加了注释。我不确切知道在 NDK 构建系统中要做什么,但如果它像一般的 Android 生成文件一样工作,您可以将标志添加到 LOCAL_LDFLAGS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    相关资源
    最近更新 更多