构建Android ROM映像时出现非常奇怪的错误(基于AOSP)

时间:2016-11-12 10:13:17

标签: android c++ assembly arm dalvik

当我使用Android Open Source Project (AOSP)指南为Nexus 10设备(ARM7a)构建Android 4.3 ROM映像时,图像正常工作没有问题。但是,当我将以下内联汇编代码(从here改编)添加到Android Stack.cpp源文件时:

cv2

我收到了以下编译器错误消息:

{uint32_t pmccntr;asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr));t0=static_cast<int64_t>(pmccntr) * 64;} 
//The C++ statement to measure its execution time 
{uint32_t pmccntr;asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr));t1=static_cast<int64_t>(pmccntr) * 64;} 
time = t1-t0;

请注意我从未在添加的内联汇编代码中使用 eax ,但编译器错误消息显示 eax

根据命令行Error: no such instruction: `mrc p15,0,%eax,c9,c13,0' , 我的设备CPU是adb shell cat /proc/cpuinfo

我的构建环境(根据包含Stack.cpp文件的目录/dalvik/vm/interp/中的Android build mm 命令)是

ARMv7 Processor rev 4 (v7l)

更新#1

以下是编译Stack.cpp文件时使用的编译器命令,这些命令使用build命令PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.3 TARGET_PRODUCT=full_manta TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=cortex-a15 HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-3.16.0-70-generic-x86_64-with-Ubuntu-14.‌​04-trusty HOST_BUILD_TYPE=release BUILD_ID=JWR66V OUT_DIR=out

显示

似乎使用了正确的编译器,如下面粗体突出显示:

make -j4 libdvm showcommands

更新#2:

更改编译命令行后使用-v显示g ++前端调用的实际子工具命令,并按@Peter Cordes建议添加以下编译器指令

  

target thumb C++: libdvm <= dalvik/vm/interp/Stack.cpp prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-g++ -I libnativehelper/include/nativehelper -I dalvik -I dalvik/vm -I external/zlib -I libcore/include -I dalvik/libattr -I external/stlport/stlport -I bionic/ -I bionic/libstdc++/include -I dalvik/vm -I out/target/product/manta/obj/SHARED_LIBRARIES/libdvm_intermediates -I libnativehelper/include/nativehelper -isystem system/core/include -isystem hardware/libhardware/include -isystem hardware/libhardware_legacy/include -isystem hardware/ril/include -isystem libnativehelper/include -isystem frameworks/native/include -isystem frameworks/native/opengl/include -isystem frameworks/av/include -isystem frameworks/base/include -isystem external/skia/include -isystem out/target/product/manta/obj/include -isystem bionic/libc/arch-arm/include -isystem bionic/libc/include -isystem bionic/libc/kernel/common -isystem bionic/libc/kernel/arch-arm -isystem bionic/libm/include -isystem bionic/libm/include/arm -isystem bionic/libthread_db/include -c -fno-exceptions -Wno-multichar -msoft-float -fpic -fPIE -ffunction-sections -fdata-sections -funwind-tables -fstack-protector -Wa,--noexecstack -Werror=format-security -D_FORTIFY_SOURCE=1 -fno-short-enums -mcpu=cortex-a15 -mfloat-abi=softfp -mfpu=neon -include build/core/combo/include/arch/linux-arm/AndroidConfig.h -I build/core/combo/include/arch/linux-arm/ -Wno-unused-but-set-variable -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -mthumb-interwork -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -DNDEBUG -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -DNDEBUG -UDEBUG -fvisibility-inlines-hidden -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Wsign-promo -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -DNDEBUG -UDEBUG -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -fno-rtti -fstrict-aliasing -Wstrict-aliasing=2 -fno-align-jumps -Wall -Wextra -Wno-unused-parameter -DARCH_VARIANT=\"armv7-a-neon\" -DDVM_SHOW_EXCEPTION=1 -DWITH_JIT -DANDROID_SMP=1 -MD -MF out/target/product/manta/obj/SHARED_LIBRARIES/libdvm_intermediates/interp/Stack.d -o out/target/product/manta/obj/SHARED_LIBRARIES/libdvm_intermediates/interp/Stack.o dalvik/vm/interp/Stack.cpp

以下是使用命令#if defined(__x86_64__) || defined(__i386__) #error "x86 What on earth" #endif

后的编译输出

注意下面的错误(在编译输出结束时)是因为我删除了除-v和-o之外的所有编译器参数来缩短输出(它大约是2页),所以我只使用了prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-g++ -v -o out/target/product/manta/obj/SHARED_LIBRARIES/libdvm_intermediates/interp/Stack.o dalvik/vm/interp/Stack.cpp < / p>

当我不删除所有原始参数(大约30个)时,我没有收到该错误prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/ar‌​m-linux-androideabi-‌​g++ -v -o

fatal error: Dalvik.h: No such file or directory

更新#3:

我编写了一个名为inlineAsm.cpp的简单C ++程序,该程序使用@Peter Cordes建议的内联汇编代码,如下所示:

prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-g++ -v -o out/target/product/manta/obj/SHARED_LIBRARIES/libdvm_intermediates/interp/Stack.o dalvik/vm/interp/Stack.cpp
Using built-in specs.
COLLECT_GCC=prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-g++
COLLECT_LTO_WRAPPER=/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../libexec/gcc/arm-linux-androideabi/4.7/lto-wrapper
Target: arm-linux-androideabi
Configured with: /tmp/AOSP-toolchain/build/../gcc/gcc-4.7/configure --prefix=/tmp/toolchain-build-linux/prefix --target=arm-linux-androideabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/tmp/toolchain-build-linux/temp-install --with-mpfr=/tmp/toolchain-build-linux/temp-install --with-mpc=/tmp/toolchain-build-linux/temp-install --with-cloog=/tmp/toolchain-build-linux/temp-install --with-ppl=/tmp/toolchain-build-linux/temp-install --disable-ppl-version-check --disable-cloog-version-check --enable-cloog-backend=isl --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --disable-libitm --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --enable-initfini-array --disable-nls --prefix=/tmp/toolchain-build-linux/prefix --with-sysroot=/tmp/toolchain-build-linux/prefix/sysroot --with-binutils-version=2.22 --with-mpfr-version=3.1.1 --with-mpc-version=1.0.1 --with-gmp-version=5.0.5 --with-gcc-version=4.7 --with-gdb-version=7.3.x --with-gxx-include-dir=/tmp/toolchain-build-linux/prefix/include/c++/4.7 --with-bugurl=http://source.android.com/source/report-bugs.html --disable-bootstrap --disable-libquadmath --enable-plugins --enable-libgomp --enable-gold --enable-graphite=yes --with-cloog-version=0.17.0 --with-ppl-version=1.0 --with-arch=armv5te --program-transform-name='s&^&arm-linux-androideabi-&' --enable-gold=default
Thread model: posix
gcc version 4.7 (GCC)
COLLECT_GCC_OPTIONS='-v' '-o' 'out/target/product/manta/obj/SHARED_LIBRARIES/libdvm_intermediates/interp/Stack.o' '-march=armv5te' '-mfloat-abi=soft' '-mfpu=vfp' '-mtls-dialect=gnu'
 /home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../libexec/gcc/arm-linux-androideabi/4.7/cc1plus -quiet -v -iprefix /home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/ -D_GNU_SOURCE dalvik/vm/interp/Stack.cpp -mbionic -fpic -quiet -dumpbase Stack.cpp -march=armv5te -mfloat-abi=soft -mfpu=vfp -mtls-dialect=gnu -auxbase Stack -version -fno-exceptions -fno-rtti -o /tmp/cctyR1ga.s
GNU C++ (GCC) version 4.7 (arm-linux-androideabi)
    compiled by GNU C version 4.6.x-google 20120106 (prerelease), GMP version 5.0.5, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/../../../../arm-linux-androideabi/include"
ignoring nonexistent directory "/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/../../include/c++/4.7"
ignoring nonexistent directory "/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/../../include/c++/4.7/arm-linux-androideabi"
ignoring nonexistent directory "/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/../../include/c++/4.7/backward"
ignoring duplicate directory "/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/../../lib/gcc/arm-linux-androideabi/4.7/include"
ignoring nonexistent directory "/tmp/toolchain-build-linux/prefix/sysroot/usr/local/include"
ignoring duplicate directory "/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/../../lib/gcc/arm-linux-androideabi/4.7/include-fixed"
ignoring nonexistent directory "/home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/../../lib/gcc/arm-linux-androideabi/4.7/../../../../arm-linux-androideabi/include"
ignoring nonexistent directory "/tmp/toolchain-build-linux/prefix/sysroot/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/include
 /home/user/Android/nexus10/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/include-fixed
End of search list.
GNU C++ (GCC) version 4.7 (arm-linux-androideabi)
    compiled by GNU C version 4.6.x-google 20120106 (prerelease), GMP version 5.0.5, MPFR version 3.1.1, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: c3359b46636f5ec5014b000ecf7eb5d5
dalvik/vm/interp/Stack.cpp:23:20: fatal error: Dalvik.h: No such file or directory
compilation terminated.

我使用以下命令编译了上面的代码:

main()
{
int time, t0, t1, a;
{int pmccntr;asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr));t0=(pmccntr) * 64;}
a=1;
{int pmccntr;asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr));t1=(pmccntr) * 64;}
time = (t1-t0);
}

以下是我得到的编译器错误消息:

 prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-g++ inlineAsm.cpp

这很奇怪,因为正如我之前所说的,当我删除我添加到Android Stack.cpp源代码的内联汇编代码时,我可以编译和构建一个Nexus10的ROM映像,这是一个ARM7a,我可以闪存图像到设备和图像工作正常没有问题。

0 个答案:

没有答案