使用Codesourcery arm-linux-eabi交叉编译器时,由于编译器认为没有使用某些代码(特别是对于系统调用),所以无法执行某些代码。有什么办法绕过这个吗?
例如,此代码不初始化变量。
unsigned int temp = 42;
asm volatile("mov R1, %0 :: "r" (temp));
asm volatile("swi 1");
在这种情况下,temp永远不会初始化为值42。但是,如果在初始化之后添加printk,它将被初始化为正确的值42。我试过了
unsigned int temp __attribute__ ((used)) = 42;
仍然不起作用,但我收到一条警告信息:
忽略“used”属性[-Wattributes]
这是linux内核代码。
有什么建议吗?
最佳答案
这不是使用内联程序集的正确方法。如前所述,这两条语句是分开的,编译器没有理由在这两条语句之间保留任何寄存器值。您需要使用适当的输入和输出约束,将两个汇编指令放在同一个内联汇编块中,或者您可以执行如下操作,以提高编译器的效率:
register unsigned int temp __asm__("r1") = 42;
__asm__ volatile("swi 1" : : "r"(temp) : "memory");
(注意,我在clobber列表中添加了内存;我不确定您正在进行哪个syscall,但是如果syscall写入用户空间中的任何对象,“内存”需要在clobber list中列出。)
关于c - gcc优化变量,然后调用系统,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13155950/