如何解决Xilinx-GCC编译C内嵌汇编的符号重复定义错误
解决Xilinx-GCC编译内嵌NEON汇编的符号重复定义错误
编译内嵌NEON汇编代码时出现以下错误:
{standard input}:634: Error: symbol
NEONCopyPLD' is already defined {standard input}:678: Error: symbolNEONCopyPLD' is already defined
问题原因
代码里的NEONCopyPLD:是全局汇编标签,GNU汇编中不带.前缀的标签默认会被导出为全局符号。如果这段内嵌汇编所在的函数被多次实例化(比如开启函数内联、被多个调用点触发编译),就会生成多个同名全局符号,导致链接阶段冲突。而且从代码逻辑看,这个标签完全没有被任何指令引用,属于冗余定义。
解决办法
直接删除冗余的NEONCopyPLD:标签即可,修改后的代码如下:
asm volatile ( "sub %[dst], %[dst], #64 \n" "1: \n" "ldnp q0, q1, [%[src]] \n" "ldnp q2, q3, [%[src], #32] \n" "add %[dst], %[dst], #64 \n" "subs %[sz], %[sz], #64 \n" "add %[src], %[src], #64 \n" "stnp q0, q1, [%[dst]] \n" "stnp q2, q3, [%[dst], #32] \n" "b.gt 1b \n" : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory");
额外说明
如果后续需要保留类似标签(且会被引用),要将其改为局部符号,即在标签前加.前缀,比如.NEONCopyPLD:。局部符号不会被导出为全局符号,也就不会出现重复定义的问题。
内容的提问来源于stack exchange,提问作者Iyiren
相关产品推荐
相关产品推荐

