我正在将'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项目