android-ndk строит с --gc-section и как отключить? - PullRequest
1 голос
/ 27 августа 2011

Я портирую команду 'iw' на Android. Это связано с беспроводной связью. Похоже, что инструмент iw имеет набор команд, которые можно использовать, однако с сайта другого пользователя:

Взгляд на источник iw показал, что iw вставляет все эти вещи в раздел ELF, который в основном исчезает, когда вы связываетесь с -gc сечения.

Этот человек тоже портировал iw на Android, но решил сделать кросс-компиляцию через make вместо сборки Android.mk и сборки через android-ndk. Он упоминает, что всякий раз, когда удаляется --gc-section:

Итак, изгнав из командной строки моего компоновщика, я наконец есть работающий Android iw

Я считаю, что это правда. Всякий раз, когда я собираю «iw» путем создания Android.mk, а затем запускаю «iw» на моем устройстве Android, все эти команды исчезают.

Вот мой 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-секции и удаляет эти команды из секции 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 \

РЕДАКТИРОВАТЬ: я удалил все экземпляры --gc-section и --function-section из android-ndk, и после перестройки это работает! Однако я бы предпочел не изменять android-ndk, поэтому в моем локальном Android.mk должна быть модификация для удаления этих двух флагов.


РЕДАКТИРОВАТЬ: я удалил только --gc-секции из вышеупомянутых файлов android-ndk по умолчанию, и это решило проблему. Итак, --function-section не связан. Мне просто нужно выяснить, как отключить --gc-секции в локальном Android.mk

1 Ответ

2 голосов
/ 28 августа 2011

Вы можете добавить строку

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

в файл Android.mk.Но в результате вы будете одновременно указывать -gc-sections и --no-gc-sections, потому что ndk-build всегда добавляет -gc-sections опций для исполняемых файлов.

Если это не работает, у вас есть только один способ взломатьsetup.mk из вашего набора инструментов.Или вы можете собрать без ndk-build.В качестве альтернативного варианта могу предложить использовать cmake для сборки проектов Android.Подробнее см. Проект android-cmake

...