0

我有一个应用程序,其中包含一个最初为 Android NDK 版本 3 编译的库。该应用程序被搁置了一段时间,现在我正尝试在最新(Windows 64 位 r8e)版本的 NDK 上恢复它。我已经修复了大部分的小问题,但是我在为 armeabi 编译时遇到了问题。具体来说,我收到“错误指令‘锁定’”错误。通过一些搜索,我发现这个程序集对 arm 无效——事实上,如果我将 APP_ABI 设置为 x86,它编译得很好——但我不明白为什么它会生成看起来像 x86 的代码,如果我选择了要构建的 arm,特别是因为在 r3 下,arm 代码可以从相同的 .cpp 文件生成。谢谢。

应用程序.mk

APP_STL          := stlport_static
APP_MODULES      := DM
APP_CPPFLAGS     := -w -g
APP_ABI          := armeabi

include $(call all-subdir-makefiles)

安卓.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# STLPORT_BASE  := $(NDK_WRAPPERS_BASE)/stlport
LOCAL_CFLAGS    += -D__NEW__ \
                   -DANDROID \
                   -DOS_ANDROID

LOCAL_LDLIBS    += -L$(SYSROOT)/usr/lib \
                   -ldl \
                   -lGLESv1_CM \
                   -lEGL \
                   -llog

LOCAL_MODULE    := DM
LOCAL_SRC_FILES := \
    sample/test/Test.cpp 

输出

ndk-build.cmd V=1
"Compile++ thumb : DM <= Test.cpp
D:/Projects/testProj/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi/objs/sample/test/Test.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -ID:/Projects/testProj/android-ndk-r8e/sources/cxx-stl/stlport/stlport -ID:/Projects/testProj/android-ndk-r8e/sources/cxx-stl//gabi++/include -DANDROID -D__NEW__ -DANDROID -DOS_ANDROID -Wa,--noexecstack  -frtti   -w -g  -ID:/Projects/testProj/android-ndk-r8e/platforms/android-9/arch-arm/usr/include -c  jni/sample/test/Test.cpp -o ./obj/local/armeabi/objs/sample/test/Test.o
C:\Temp\ccIqfvxp.s: Assembler messages:
C:\Temp\ccIqfvxp.s:474: Error: bad instruction `lock'
C:\Temp\ccIqfvxp.s:474: Error: immediate expression requires a # prefix -- `add
r3,[r0,#4]'
C:\Temp\ccIqfvxp.s:531: Error: bad instruction `lock'
C:\Temp\ccIqfvxp.s:531: Error: immediate expression requires a # prefix -- `add
r3,[r4,#4]'
make: *** [obj/local/armeabi/objs/sample/test/Test.o] Error 1
4

2 回答 2

0

事实证明,有人偷走了一些我不知道的 x86 汇编代码。我能够#ifdef 这个了,现在它在 arm 上工作得很好。

于 2013-04-24T14:42:10.520 回答
0

最近在 x86 构建机器上为 arm 的 debian 构建遇到了类似的问题。特别是 qt 库。项目是使用 chroot 中的标准debian 工具构建的(此处man -k chroot详细信息)。

./debian/control 文件是构建过程的重要组成部分,其中包括以下字段:

Build-Depends:
...
Depends:

这是一个简单的例子:

Source: file-mon                                                                                                                                                                                                                                                                                                             
Section: non-free/embedded
Priority: extra
Maintainer: Dmytro Poliarush
Build-Depends: libqtcore4:armhf, libqt4-dev:armhf
Standards-Version: 3.9.d
X-Python-Version: >= 2.6 
X-Python3-Version: >= 3.2 
Homepage: http://www.harmonicinc.com

Package: file-mon
Architecture: any
Depends: libqtcore4:armhf
Description:  Mainly for running tests.

如果没有明确指定 Build-Depends 中的架构,例如libqt4-dev:armhfdebian 脚本,则在准备 chroot 来构建项目时,请执行apt-get install libqt4-dev. 在这种情况下,至少在 x86 上,架构默认为amd64. 并引发汇编错误:

...
make[1]: Entering directory '/home/dpoliaru/Documents/test/file-mon'
arm-linux-gnueabihf-g++ -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wall --std=c++14 -I /usr/include/qt4/ -I /usr/include/qt4/QtCore/ -DNDEBUG  -D_FORTIFY_SOURCE=2 -Wl,-z,relro -L /usr/lib/arm-linux-gnueabihf/libQtCore.so.4  file-mon.cpp   -o file-mon
/tmp/cckjHuQp.s: Assembler messages:
/tmp/cckjHuQp.s:53: Error: bad instruction `lock'
/tmp/cckjHuQp.s:54: Error: bad instruction `decl [r3]'
/tmp/cckjHuQp.s:55: Error: bad instruction `setne r2'
<builtin>: recipe for target 'file-mon' failed
make[1]: *** [file-mon] Error 1
make[1]: Leaving directory '/home/dpoliaru/Documents/test/file-mon'
dh_auto_build: make -j1 returned exit code 2
debian/rules:22: recipe for target 'build' failed
make: *** [build] Error 2
dpkg-buildpackage: error: debian/rules build gave error exit status 2
...

这基本上意味着,该汇编程序制作并尝试将一些 x86 插入 armhf exec。指定显式架构libqt4-dev:armhf,需要构建工具来安装所有必需的头文件,用于 armhf 的库。

于 2019-05-18T11:24:48.617 回答