我用arm-linux-gnueabihf移植MP3播放器libmad-0.15.1b的时候出现错误提示:
/tmp/ccf2FxyW.s:1299: Error: selected processor does not support Thumb mode `rsc r0,r0,#0'
/tmp/ccf2FxyW.s:1435: Error: selected processor does not support Thumb mode `rsc r8,r8,#0'
/tmp/ccf2FxyW.s:1857: Error: selected processor does not support Thumb mode `rsc r0,r0,#0'
/tmp/ccf2FxyW.s:1996: Error: selected processor does not support Thumb mode `rsc r0,r0,#0'理解为处理器与编译器不付,感觉是次编译器不认这几条汇编指令
而用arm-arago-linux-gnueabi 编译器是能够移植成功的。不知道问题出在哪儿了
Yaoming Qin:
你可以google看看,对于thumb代码,应该有相应的编译选项,是不是没有加上
liqin xiao:
回复 Yaoming Qin:
从config.log里的内容Target: arm-linux-gnueabihfConfigured with: /cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/src/gcc-linaro-4.7-2013.03/configure –build=i686-build_pc-linux-gnu –host=i686-build_pc-linux-gnu –target=arm-linux-gnueabihf –prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install –with-sysroot=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc –enable-languages=c,c++,fortran –enable-multilib –with-arch=armv7-a –with-tune=cortex-a9 –with-fpu=vfpv3-d16 –with-float=hard –with-pkgversion='crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 – Linaro GCC 2013.03' –with-bugurl=https://bugs.launchpad.net/gcc-linaro –enable-__cxa_atexit –enable-libmudflap –enable-libgomp –enable-libssp –with-gmp=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-mpfr=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-mpc=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-ppl=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-cloog=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-libelf=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static –with-host-libstdcxx='-L/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/.build/arm-linux-gnueabihf/build/static/lib -lpwl' –enable-threads=posix –disable-libstdcxx-pch –enable-linker-build-id –enable-gold –with-local-prefix=/cbuild/slaves/oorts/crosstool-ng/builds/arm-linux-gnueabihf-linux/install/arm-linux-gnueabihf/libc –enable-c99 –enable-long-long –with-mode=thumb上看缺省的就是–wirh-mode=thumb,感觉这个需要设置成–wirh-mode=arm模式,可是在configure的时候加上–with-mode=arm,最后config.log里显示的还是thumb,改不过来,查看了arago的那个config里没有–with-mode这一项它的config.log设置值是Target: arm-arago-linux-gnueabiConfigured with: /sim/scratch_a0850442/arago-tmp-arago/work/i686-armv7a-sdk-arago-linux-gnueabi/gcc-cross-sdk-4.5-r41.2+svnr170880/gcc-4_5-branch/configure –build=i686-linux –host=i686-linux –target=arm-arago-linux-gnueabi –prefix=/arago-2011.09/armv7a –exec_prefix=/arago-2011.09/armv7a –bindir=/arago-2011.09/armv7a/bin –sbindir=/arago-2011.09/armv7a/bin –libexecdir=/arago-2011.09/armv7a/libexec –datadir=/arago-2011.09/armv7a/share –sysconfdir=/arago-2011.09/armv7a/etc –sharedstatedir=/arago-2011.09/armv7a/share/com –localstatedir=/arago-2011.09/armv7a/var –libdir=/arago-2011.09/armv7a/lib –includedir=/arago-2011.09/armv7a/include –oldincludedir=/arago-2011.09/armv7a/include –infodir=/arago-2011.09/armv7a/share/info –mandir=/arago-2011.09/armv7a/share/man –enable-largefile –disable-nls –enable-ipv6 –with-gnu-ld –enable-shared –enable-languages=c,c++,objc,fortran –enable-threads=posix –disable-multilib –enable-c99 –enable-long-long –enable-symvers=gnu –enable-libstdcxx-pch –program-prefix=arm-arago-linux-gnueabi- –enable-target-optspace –enable-lto –enable-libssp –disable-bootstrap –disable-libgomp –disable-libmudflap –with-float=softfp –with-sysroot=/arago-2011.09/armv7a/arm-arago-linux-gnueabi –with-build-time-tools=/sim/scratch_a0850442/arago-tmp-arago/sysroots/i686-linux/usr/armv7a/arm-arago-linux-gnueabi/bin –with-build-sysroot=/sim/scratch_a0850442/arago-tmp-arago/sysroots/armv7a-arago-linux-gnueabi –disable-libunwind-exceptions –with-mpfr=/sim/scratch_a0850442/arago-tmp-arago/sysroots/i686-linux/usr –with-system-zlib –enable-__cxa_atexi
不知道用此项编译器的朋友,是怎么设置的?
liqin xiao:
回复 Yaoming Qin:
查了一下是因为"rsc" doesnt exist anymore in thumb2,怎么才能正确修改?
liqin xiao:
回复 Yaoming Qin:
感谢你Qin的热心解答,编译已经通过了
liqin xiao:
回复 liqin xiao:
虽然修改了有关rsc的bug程序,最终是这么修改的,将"rsc %1, %3, #0" 改为"subs %1, %0, %3" ,其中也按照网上提供的bug修改改过,结果是一样的。可是编译好的应用在目标板上运行,出现了Segmentation fault,不知道是哪里出现的问题,用修改过的程序用arm-arago编译器编译的madplay能够正常播放
care lee:
回复 liqin xiao:
在哪里修改这个有关bug的程序阿?怎么修改?
liqin xiao:
回复 care lee:
我是按照6楼亲提供的那个网址改变的,不过你可以看看前面的回复,虽然编译通过但是仍不好用
zhipeng xie:
回复 liqin xiao:
diff --git a/package/libmad/libmad-0.15.1b-thumb2-fixed-arm.patch b/package/libmad/libmad-0.15.1b-thumb2-fixed-arm.patch new file mode 100644 index 0000000..befda48 --- /dev/null +++ b/package/libmad/libmad-0.15.1b-thumb2-fixed-arm.patch @@ -0,0 +1,40 @@ +Fixes Thumb2-related build failure + +Patch below comes from the Debian libmad package. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + +From: Dave Martin +Subject: "rsc" doesnt exist anymore in thumb2 + +diff --git a/fixed.h b/fixed.h +index 4b58abf..ba4bc26 100644 +--- a/fixed.h ++++ b/fixed.h +@@ -275,12 +275,25 @@ mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) + : "+r" (lo), "+r" (hi) \ + : "%r" (x), "r" (y)) + ++#ifdef __thumb__ ++/* In Thumb-2, the RSB-immediate instruction is only allowed with a zero ++ operand. If needed this code can also support Thumb-1 ++ (simply append "s" to the end of the second two instructions). */ ++# define MAD_F_MLN(hi, lo) \ ++ asm ("rsbs %0, %0, #0\n\t" \ ++ "sbc %1, %1, %1\n\t" \ ++ "sub %1, %1, %2" \ ++ : "+&r" (lo), "=&r" (hi) \ ++ : "r" (hi) \ ++ : "cc") ++#else /* ! __thumb__ */ + # define MAD_F_MLN(hi, lo) \ + asm ("rsbs %0, %2, #0\n\t" \ + "rsc %1, %3, #0" \ +- : "=r" (lo), "=r" (hi) \ ++ : "=&r" (lo), "=r" (hi) \ + : "0" (lo), "1" (hi) \ + : "cc") ++#endif /* __thumb__ */ + + # define mad_f_scale64(hi, lo) \ + ({ mad_fixed_t __result; \ diff --git a/package/libmad/libmad-0.15.1b-thumb2-imdct-arm.patch b/package/libmad/libmad-0.15.1b-thumb2-imdct-arm.patch new file mode 100644 index 0000000..414b9c8 --- /dev/null +++ b/package/libmad/libmad-0.15.1b-thumb2-imdct-arm.patch @@ -0,0 +1,20 @@ +Fixes Thumb2 related build failure + +Patch below comes from the Debian libmad package. + +Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + +From: Konstantinos Margaritis <markos@debian.org> +Subject: use "adr" instead of "add" to make code ready for thumb2 + +--- ./imdct_l_arm.S.orig 2010-02-25 13:25:23.000000000 +0100 ++++ ./imdct_l_arm.S 2010-02-25 13:27:26.000000000 +0100 +@@ -468,7 +468,7 @@ + + @---- + +- add r2, pc, #(imdct36_long_karray-.-8) @ r2 = base address of Knn array (PIC safe ?) ++ adr r2, imdct36_long_karray + + + loop:亲测可用