【发布时间】:2011-01-28 10:47:04
【问题描述】:
我正在尝试使用内联汇编程序在代码部分中嵌入指向字符串的指针。但是 gcc 在符号名称的开头添加了一个 $,导致链接错误。
这是一个最小的示例,
static const char str[] = "bar";
int main()
{
__asm__ __volatile__
(
"jmp 0f\n\t"
".long %0\n\t"
"0:"
:
: "i" ( str )
);
return 0;
}
构建
gcc -Wall -save-temps test.c -o test
给出错误
test.o: In function `main':
test.c:(.text+0x6): undefined reference to `$str'
查看 .s 临时文件,可以看到附加在 str 前面的 $
.file "test.c"
.section .rodata
.type str, @object
.size str, 4
str:
.string "bar"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
#APP
# 4 "test.c" 1
jmp 0f
.long $str
0:
# 0 "" 2
#NO_APP
movl $0, %eax
leave
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
.section .note.GNU-stack,"",@progbits
认为我这样做是正确的,因为同样的方法适用于 ppc gcc,
<clip>
b 0f
.long str
0:
</clip>
再一次,也许它只是“运气”它适用于 ppc。问题是因为在使用 AT&T 语法时 $ 被用作立即数的前缀吗?
在这个简单的示例中,我可以通过在内联汇编器中硬编码符号名称“str”来解决此问题,但我确实需要将其作为内联汇编器的输入约束。
有没有人知道如何让它在 x86 目标上工作?
谢谢,
- 卢克
【问题讨论】:
标签: gcc assembly x86 inline-assembly