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

构建Android ROM映像时出现非常奇怪的错误(基于AOSP),android,c++,assembly,arm,dalvik,Android,C++,Assembly,Arm,Dalvik,当我使用指南为Nexus10设备(ARM7a)构建安卓4.3ROM映像时,该映像运行良好,没有问题。但是,当我将以下内联汇编代码(改编自)添加到Android源文件时: {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 execut

当我使用指南为Nexus10设备(ARM7a)构建安卓4.3ROM映像时,该映像运行良好,没有问题。但是,当我将以下内联汇编代码(改编自)添加到Android源文件时:

{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

根据命令行
adb shell cat/proc/cpuinfo
, 我的设备CPU是
ARMv7处理器版本4(v7l)

我的构建环境(根据包含Stack.cpp文件的目录中的Android buildmm命令)是

更新#1

下面是编译Stack.cpp文件时使用的编译器命令,使用build命令
make-j4 libdvm showcommands

似乎使用了正确的编译器,如下粗体所示:

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
更新#3:

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

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
以下是我收到的编译器错误消息:

/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/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or 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/bin/ld: error: cannot open crtend_android.o: No such file or 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/bin/ld: error: cannot find -lstdc++
/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/bin/ld: error: cannot find -lm
/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/bin/ld: error: cannot find -lc
/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/bin/ld: error: cannot find -ldl
collect2: error: ld returned 1 exit status

这是非常奇怪的,因为正如我之前所说,当我删除添加到Android Stack.cpp源代码中的内联汇编代码时,我可以编译并构建Nexus10(即ARM7a)的ROM映像,我可以将映像闪存到设备上,映像工作正常,没有问题

您确定代码是用ARM交叉编译器生成的,而不是用以x86为目标的编译器生成的吗?您可以通过将
-v
标志添加到问题代码所属模块的
本地\u CFLAGS
中,然后检查生成来找到答案logs@Michael:在将内联汇编代码添加到应用程序之后,我正在构建Android源代码本身(而不是应用程序)。如何查找该模块的
本地\u CFLAGS
,以及如何添加
-v
?正如我之前所说,我遵循了AOSP构建指南,并且没有改变任何步骤。我认为我是为ARM而不是x86构建的,因为当我删除我添加的代码时,生成的编译ROM映像在我将其闪存到Nexus 10(一个ARM7aWell)时运行良好,问题很明显,在某些时候,出于某种原因,这些代码正在通过x86编译器进行编译——不过,我对Android构建过程一无所知,无法解释原因。这并不是说它没有为ARM构建。@Michael,@Notlikethat:从上面的更新中可以看出,似乎是正确的编译器(用于ARM)正在用于编译该文件。请尝试将该编译命令行更改为使用
-v
,以显示
g++
前端调用的实际子工具命令。也许可以尝试在源代码中添加
#if defined(uuux86_64_uuuu)| defined(uuui386_uuu)
#error“x86 WTF”
#endif
,看看预处理器是否也“认为”您正在为x86构建,因为这显然是正在发生的事情。使用asm语句在“
r1
”或其他内容上声明一个clobber可能也很有趣。(不要使用
r8-r15
,x86-64也有具有这些名称的寄存器!)。这将在编译时中断,而不是在汇编时中断。
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
/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/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or 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/bin/ld: error: cannot open crtend_android.o: No such file or 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/bin/ld: error: cannot find -lstdc++
/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/bin/ld: error: cannot find -lm
/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/bin/ld: error: cannot find -lc
/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/bin/ld: error: cannot find -ldl
collect2: error: ld returned 1 exit status