我只是试图编译我从书中键入的一些简单示例代码,GCC给了我以上错误。这是我的代码:

$ cat -n test.cpp

 1  #define READ_COMMAND    3
 2
 3  #define MSG_LENGTH  128
 4
 5  #include <stdlib.h>
 6  #include <stdio.h>
 7
 8  int main(int argc, char *arg[])
 9  {
10      int syslog_command = READ_COMMAND;
11      int bytes_to_read = MSG_LENGTH;
12      int retval;
13      char buffer[MSG_LENGTH];
14
15      asm volatile(
16          "movl %1, %%ebx\n\t"
17          "movl %2, %%ecx\n\t"
18          "movl %3, %%edx\n\t"
19          "movl $103, %%eax\n\t"
20          "int $128\n\t"
21          "movl %%eax, %0"
22          :"=r" (retval)
23          :"m"(syslog_command),"r"(buffer),"m"(bytes_to_read)
24          :"%eax","%ebx","%ecx","%edx");
25      if (retval > 0) printf("%s\n", buffer);
26
27  }
28
29

该代码应该调用syslog()系统调用以从内核printk()环形缓冲区读取最后128个字节。以下是有关我的操作系统和系统配置的一些信息:
uname -a:


gcc -v:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu


Thread model: posix

gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)

这是完整的错误:
$ gcc test.cpp

test.cpp: Assembler messages:

test.cpp:25: Error: unsupported for `mov'

最佳答案

您试图在64位计算机上编译32位汇编代码。您列出的内联程序集编译为:

movl -24(%rbp), %ebx
movl %rsi, %ecx       <--- error here
movl -28(%rbp), %edx
movl $103, %eax
int $128
movl %eax, %r12d

如您所见,您正在尝试将64位寄存器存储在32位寄存器中,这是非法的。更重要的是,这也不是64位ABI系统调用协议(protocol)。

尝试使用-m32进行编译以强制使用32位ABI。

07-24 09:47
查看更多