代码之家  ›  专栏  ›  技术社区  ›  EboMike

如何防止某些功能被剥离?

  •  5
  • EboMike  · 技术社区  · 14 年前

    我有一个静态库,其中包含一些Jnicall函数,即期望从JVM调用这些函数,并且这些函数永远不会被链接静态库的共享库引用。

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

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   EboMike    14 年前

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

    转到ndk安装中的“build”目录,搜索本地\static \u库的所有实例。复制并粘贴所有这些文件,并添加一个版本,该版本与本地\static_whole_库执行相同的操作。

    准确地说:在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)
    

    注意静态整体和整体静态之间的差异-这就是在ndk中的情况,我选择保持这种方式,即使它是不一致的。

    最后,在build/toolchains/arm-eabi-4.4.0/setup.mk中:已经有了用于共享库的私有“整体”库块。您也可以选择为可执行文件添加它,尽管这很可能不是必需的。

        2
  •  1
  •   Community Ramakrishna.p    7 年前