【发布时间】:2020-11-13 11:02:54
【问题描述】:
这是一个最小的可重现示例:
/*
* Example for Xtensa xt-xcc compiler "error: attempt to move .org backwards".
*/
struct k_dict
{
char *m_name_dict;
char *p_name_dict;
union
{
float f_value;
int i_value;
char* s_value;
};
};
struct k_mode
{
const char* m_name;
int p_number;
const struct k_dict *p;
const struct k_dict pars[];
};
struct k_dict P1[] =
{
{.m_name_dict="M1", .p_name_dict="P1", .s_value="string"},
{.m_name_dict="M2", .p_name_dict="P2", .i_value=5 },
{.m_name_dict="M3", .p_name_dict="P3", .f_value=48.0 }
};
struct k_mode mode_default =
{
.m_name = "default",
.p_number = 1,
.p = P1,
.pars =
{
{.m_name_dict = "m", .p_name_dict="p", .s_value="s"}
}
};
int main( int argc, char **argv )
{
return 0;
}
使用 Tensilica Xtensa xt-xcc 编译器编译会出现汇编错误:
"xt-xcc" -c -g -O0 -std=c11 -fmessage-length=0 -DPROC_hifi3_tv_car_5 -DCONFIG_hifi3_tv_car_5 --xtensa-system=hifi3_tv_car_5/config --xtensa-core=hifi3_tv_car_5 --xtensa-params= "\"HelloWorld/main.c\"" -o "\"HelloWorld/bin/hifi3_tv_car_5/Debug/main.o\""
/Temp/cc0s#6c7c.a32040: Assembler messages:
/Temp/cc0s#6c7c.a32040:39: Error: attempt to move .org backwards
xt-xcc ERROR: XtensaTools/bin/xt-as.exe returned non-zero status 1
这是从哪里来的?
注意:GCC 工作正常。
【问题讨论】:
-
xt-as是 GAS 的构建(来自 GNU Binutils)作为交叉汇编器,还是 Xtensa 自己的汇编器? -
正如手册所说:“它是为 Xtensa 架构配置的 GNU 汇编器。”。
-
另外:“与旧的汇编程序不同,
xt-as旨在在源文件的一次传递中汇编源程序。这对.org指令有微妙的影响。” -
一般来说,GAS 一直是一次性的汇编程序;我认为他们正在比较早期的非 GAS 组装器(如果没有其他用于 Xtensa 的 ISA,则用于其他 ISA)。您没有链接有关 xcc / xt-as 工具链的任何内容,因此我仍然不知道您引用的是哪个手册,因为我从未使用过此 ISA。但无论如何,现在我们知道这是正常的 GAS。我忘记了 GAS 通常是否允许使用
.org向后搜索,我只记得 NASM。我不知道为什么 C 编译器首先会发出多个.org指令。 -
许多编译器系统使用中间文件,包括临时汇编源文件。通常您可以提供保留这些临时文件的选项,请试试这个。然后查看中间程序集源以进一步调查。
标签: c assembly gnu-assembler xtensa