【问题标题】:x86_64-pc-cygwin-gcc compile assembly errorx86_64-pc-cygwin-gcc 编译汇编错误
【发布时间】:2013-11-19 02:02:53
【问题描述】:

我运行了一段简单的 hello world 的 x86-64 汇编代码。

    .global main

    .text
main:                                
    mov     $message, %rdi       
    sub     $8, %rsp             
    call    puts                 
    add     $8, %rsp             
    ret  

message:
    .asciz "Hello, World"

我在我的64位windows操作系统下使用cygwin下的gcc_4.8.2编译这个程序。

gcc -o helloworld helloworld.s

但编译器总是给我错误:

/tmp/ccylxw5q.o:fake:(.text+0x3): relocation truncated to fit: R_X86_64_32S against `.text'

如何解决这个问题?

【问题讨论】:

  • 您的编译器是否创建 64 位代码?如果是 cygwin,它可能不会。
  • 实际上是创建64位代码,否则编译器会报错寄存器。
  • 我建议你在 C "Hello, World" 代码上运行 gcc -S 以便你可以看到差异。

标签: gcc assembly cygwin


【解决方案1】:

gas(由gcc 调用)下,如果要加载64 位立即数,则需要使用movabsq 助记符。否则,汇编器将使用 32 位符号扩展 mov,这也由 32S 的重定位类型指示。 message 的最终地址在某些内存布局下可能不会表示为 32 位符号扩展值,这可能会导致截断警告。

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多