我运行一个简单的x86-64 hello world汇编代码。
.global main
.text
main:
mov $message, %rdi
sub $8, %rsp
call puts
add $8, %rsp
ret
message:
.asciz "Hello, World"
我在cygwin下使用gcc_4.8.2在我的64位windows os下编译这个程序。
gcc -o helloworld helloworld.s
但编译器总是给我错误:
/tmp/ccylxw5q.o:fake:(.text+0x3): relocation truncated to fit: R_X86_64_32S against `.text'
如何解决这个问题?
答案 0 :(得分:0)
在gas
下(由gcc
调用)如果要立即加载64位,则需要使用movabsq
助记符。否则,汇编器将使用32位符号扩展mov,这也是32S
的重定位类型所指示的。在某些内存布局下,message
的最终地址可能不会表示为32位符号扩展值,这可能会导致截断警告。