c++ - 使用内联汇编器时编译器的详细输出?

标签 c++ assembly g++ arm inline-assembly

我在 ARM 下使用一些内联汇编程序捕获编译失败:

g++ -DNDEBUG -g2 -O2 -pipe -c sha.cpp
{standard input}: Assembler messages:
{standard input}:779: Error: ARM register expected -- `ror [sp,#20],#31'
{standard input}:799: Error: ARM register expected -- `ror [sp],#31'
{standard input}:848: Error: ARM register expected -- `ror [sp,#4],#31'

虽然不明显,但上面的代码可能会在四个旋转中的一个旋转时阻塞,这取决于 CPU 的特性,比如拇指是否有效。

“标准输入” 不是很有帮助,我正试图让 GCC 提供有关源代码中违规行的更多信息。 --verbose 编译器驱动程序和汇编器都不会生成它:

g++ --verbose -Wa,--verbose -DNDEBUG -g2 -O2 -pipe -c sha.cpp
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
Target: arm-linux-gnueabi
...
COLLECT_GCC_OPTIONS='-v' '-D' 'NDEBUG' '-g2' '-O2' '-pipe' '-c' '-shared-libgcc'
  '-march=armv4t' '-mfloat-abi=soft' '-mtls-dialect=gnu'
/usr/lib/gcc/arm-linux-gnueabi/5/cc1plus -quiet -v -imultilib . -imultiarch arm-linux-gnueabi
  -D_GNU_SOURCE -D NDEBUG sha.cpp -quiet -dumpbase sha.cpp -march=armv4t -mfloat-abi=soft
  -mtls-dialect=gnu -auxbase sha -g2 -O2 -version -o - |
as -v -march=armv4t -mfloat-abi=soft -meabi=5 --verbose -o sha.o
GNU assembler version 2.25.1 (arm-linux-gnueabi) using BFD version (GNU Binutils for Debian)
...
ignoring duplicate directory "/usr/include/arm-linux-gnueabi/c++/5"
ignoring nonexistent directory "/usr/local/include/arm-linux-gnueabi"
...
Compiler executable checksum: e1a12b8fe77987e69c757712d6e0213e
{standard input}: Assembler messages:
{standard input}:779: Error: ARM register expected -- `ror [sp,#20],#31'
{standard input}:799: Error: ARM register expected -- `ror [sp],#31'
{standard input}:848: Error: ARM register expected -- `ror [sp,#4],#31'

如何让 GCC 打印更多信息,例如相关行号?

提前致谢。

最佳答案

使用 GNU 的列表选项,-ahl 将生成一个包含高级源代码和汇编程序的列表。您需要将 -g 选项传递给 gcc,因此您需要选项 -Wa,-ahl -g

关于c++ - 使用内联汇编器时编译器的详细输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32546251/

相关文章:

c++ - 每次我要使用外部资源时,我都会得到 : collect2. exe: error ld returned 1 exit status

linux - 汇编浮点运算

c - Extended Inline Assembly GCC-编译时表达式错误后错误的寄存器名称和垃圾 'done'

c++ - 排序 vector 时运算符重载的编译错误

c++ - 由于变体成员,N3690/N4140 与 N4659/N4727,隐式定义的构造函数被删除

c++ - Qwidget,如何高亮光标下的widget

c++ - basic_istream<>::tellg() 和 basic_ostream<>::tellp() 的区别

c++ - 使用 MPI 进行并行编程以使用动态二维数组进行矩阵乘法时如何解决问题?

gcc - 如何测量处理器周期中的 x86 和 x86-64 汇编命令执行时间?

linux - 我可以强制编译器将我的共享库也放入二进制文件中吗?