android-ndk是否使用——gc-sections构建,以及如何禁用



我正在将'iw'命令移植到Android。这与无线有关。看起来iw工具有一组可以从其他用户的站点使用的命令:

看一下信息源,就会发现它把所有的东西都粘在一个ELF部分,当你链接到-gc-sections .

这个人也在移植'iw'到Android,但决定通过make进行交叉编译,而不是构建Android。通过android-ndk进行构建。他提到每当--gc-sections被移除时:

从链接器命令行中删除后,我终于拥有一个正常运行的Android系统

我发现这是真的。每当我通过构建Android来构建"iw"时。然后在我的Android设备上运行'iw',所有这些命令都消失了。

这是我的Android.mk:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= 
  iw.c 
  genl.c 
  event.c 
  info.c 
  phy.c 
  interface.c 
  ibss.c 
  station.c 
  survey.c 
  util.c 
  mesh.c 
  mpath.c 
  scan.c 
  reg.c 
  version.c 
  reason.c 
  status.c 
  connect.c 
  link.c 
  offch.c 
  ps.c 
  cqm.c 
  bitrate.c 
  wowlan.c 
  roc.c 
  sections.c

LOCAL_C_INCLUDES += $(LOCAL_PATH)/../lowpan/include 
  $(LOCAL_PATH)/../libnl/include
  
LOCAL_CFLAGS +=  -g
LOCAL_CFLAGS += -fPIC -DPIC
LOCAL_STATIC_LIBRARIES := libnls libnl
ifeq ($(TARGET_BUILD_TYPE),release)
  LOCAL_CFLAGS += -g
endif
LOCAL_MODULE:= iw
include $(BUILD_EXECUTABLE)

如果android-ndk以某种方式使用--gc-sections并从ELF部分删除这些命令是真的,我不知道如何阻止它这样做。有人有什么建议吗?


编辑:它看起来像NDK在使用这个:
build/core/default-build-commands.mk:    -Wl,--gc-sections 
build/tools/toolchain-patches/build/0001-Options-brought-in-from-core-combo-for-IA.patch:+  -fexceptions -ffunction-sections -finline-functions 
build/tools/toolchain-patches/build/0001-Options-brought-in-from-core-combo-for-IA.patch:+  -Wl,-z,noexecstack -Wl,--gc-sections -nostdlib 
build/tools/toolchain-patches/build/0001-Options-brought-in-from-core-combo-for-IA.patch:+  -fexceptions -frtti -fstrict-aliasing -ffunction-sections -finline-functions  
build/tools/toolchain-patches/build/0001-Options-brought-in-from-core-combo-for-IA.patch:+  -ffunction-sections -funwind-tables -fmessage-length=0 
toolchains/arm-linux-androideabi-4.4.3/setup.mk:    -ffunction-sections 
toolchains/arm-linux-androideabi-4.4.3/setup.mk:    -Wl,--gc-sections 
toolchains/x86-4.4.3/setup.mk:    -ffunction-sections 
toolchains/x86-4.4.3/setup.mk:    -Wl,--gc-sections 

编辑:我从android-ndk中删除了--gc-sections-ffunction-sections的所有实例,重建后它可以工作!然而,我宁愿不修改Android -ndk,所以必须对我本地的Android进行修改。
编辑:我只从上面的默认android-ndk文件中删除了--gc-sections,这就解决了问题。所以,-ffunction-sections是不相关的。我只需要弄清楚如何禁用--gc-sections在本地android。mk

可以添加line

LOCAL_LDLIBS += -Wl,--no-gc-sections

到你的Android。可文件。但结果是你将同时指定-gc-sections--no-gc-sections,因为ndk-build总是为可执行文件添加-gc-sections选项。

如果这不起作用,那么你只有从你的工具链中破解setup.mk的方法。或者你可以不使用ndk-build来构建。作为另一种变体,我可以建议使用cmake来构建Android项目。详见android-cmake项目

最新更新