求解gcc编译c内联汇编标号报错的一个问题

不高兴你咬我 发布于 2016/09/03 13:45
阅读 472
收藏 0

使用gcc编译c语言内联汇编使用-O优化时,是标号部分报错,请问有知道怎么解决的吗?

unsigned long strcpy0(char* dst,const char* src)
{
	__asm__ __volatile__
		(
		 ".intel_syntax noprefix\n"
		 "POS2:\n"
		 "lodsb\n"
		 "stosb\n"
		 "test al,al\n"
		 "jnz POS2\n"
		 :
		 :
		 :"rax","rbx"
		 );
}
报错信息如下:

gcc -masm=intel -O3 -c -o test.o test.c

test.c: Assembler messages:

test.c:7: Error: symbol `POS2' is already defined

test.c:7: Error: symbol `POS2' is already defined

test.c:7: Error: symbol `POS2' is already defined

加载中
0
中山野鬼
中山野鬼

这事帮不了了。刚才随手测了一下,我的gcc 直接make是可以的。 如果用你上面的命令 -masm=intel 参数无法识别。。哈。 我的 gcc -v 的信息如下:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1

Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)

Target: x86_64-apple-darwin13.1.0

Thread model: posix


不高兴你咬我
不高兴你咬我
好的,谢谢你,查找了好长时间没有找到解决办法
0
不高兴你咬我
不高兴你咬我

引用来自“中山野鬼”的评论

这事帮不了了。刚才随手测了一下,我的gcc 直接make是可以的。 如果用你上面的命令 -masm=intel 参数无法识别。。哈。 我的 gcc -v 的信息如下:

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1

Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)

Target: x86_64-apple-darwin13.1.0

Thread model: posix


unsigned long strcpy0(char* dst,const char* src)
{
	__asm__ __volatile__
		(
		 ".intel_syntax noprefix\n"
		 "POS_1:\n"
		 "lodsb\n"
		 "stosb\n"
		 "test al,al\n"
		 "jnz POS_1\n"
		 :
		 :
		 :"rax","bl"
		 );
}

int main()
{
	char dst[1024] = {0};
	char src[1024] = {0};
	memset(src,1,1023);
	time_t timbeg = time(0);
	for(int i = 0;i < 100*10000;i++)
	{
		for(int j = 0;j < 3;j++)
		{
			strcpy0(dst,src);
		}
	}
	printf("==%lu==\n",time(0) - timbeg);
}



已经解决,函数的声明和定义放在了一起导致gcc加-O进行优化时,直接内联函数,并对内层循环进行了展开处理,造成了同一个标号定义了多次。
解决方法是把函数的声明和定义放在不同的文件中。



返回顶部
顶部