Cygwin:重定位被截断以适应“.data”的R_X86_64_32S

时间:2014-08-25 18:07:45

标签: assembly cygwin linker-errors

我最近试图从“从头开始编程”一书中编写“查找最大值”程序。由于我使用的是Windows,因此我使用Cygwin编译汇编文件。但是,我收到以下错误:

/tmp/ccuamKmO.o:fake:(.text+0xc): relocation truncated to fit: R_X86_64_32S against `.data'
/tmp/ccuamKmO.o:fake:(.text+0x1d): relocation truncated to fit: R_X86_64_32S against `.data'
collect2: error: ld returned 1 exit status


这可能是一些愚蠢的错误,我真的无法识别它。 这是该程序的代码:

.section .data
    data_items: 
        .long 3, 67, 34, 222, 45, 75, 54, 34, 44, 33, 22, 11, 66, 0

.section .text
    .globl main

main:
    jmp find_largest
  ret_find_largest:

    ret

/* 
 * %edi - Holds the index of the item being examined
 * %ebx - Largest item found
 * %eax - Current item
 */
find_largest:
    movl $0, %edi
    movl data_items(,%edi,4), %eax /* load eax with first item */
    movl %eax, %ebx

  start_loop:
    cmpl $0, %eax
    je loop_exit
    incl %edi
    movl data_items(,%edi,4), %eax
    cmpl %ebx, %eax
    jle start_loop
    movl %eax, %ebx
    jmp start_loop

  loop_exit:
    jmp ret_find_largest

4 个答案:

答案 0 :(得分:2)

看起来您的汇编程序代码适用于32位计算机,但您正在为x64进行组装。尝试在命令行上添加-m32

答案 1 :(得分:0)

我面临着这个问题。试着用gcc -no-pie file.s -o file进行编译 它对我来说很好。然后./file以运行可执行文件

答案 2 :(得分:0)

这似乎是一个Windows错误。我有同样的一个,无法弄清楚如何解决它。 在linux上尝试完全相同的东西。

对于x64和nasm:

nasm -f elf64 -o <asm_name>.o <asm_name>.asm

如果您正在使用调用它的c程序,请按照以下步骤操作:

gcc -m64 -o <c_name> <c_name>.c <asm_name>.asm

您最后可以使用./<c_name>

来调用它

我知道,这不是解决问题的真正办法,但至少可以采用一种方式。

答案 3 :(得分:-1)

当我遇到这个问题时,答案很简单,我试图编译错误。

一旦我创建了目标文件:    gcc -g -O -c main.c functions.c

我可以编译程序:     gcc main.o functions.o -o prog

对不起,我不知道汇编程序,所以不知道这是否适用于OP。希望这对某人有帮助。