Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Cygwin:重新定位被截断,以适应R#u X86_64_32S与';的对比;。数据';_Assembly_Cygwin_Linker Errors - Fatal编程技术网

Assembly Cygwin:重新定位被截断,以适应R#u X86_64_32S与';的对比;。数据';

Assembly Cygwin:重新定位被截断,以适应R#u X86_64_32S与';的对比;。数据';,assembly,cygwin,linker-errors,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 agains

我最近试图编译《从头开始编程》一书中的“寻找最大值”程序。因为我使用的是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

您的汇编代码似乎是为32位机器编写的,但您是为x64编写的。尝试在命令行中添加
-m32

我面临这个问题。只需使用
gcc-no-pie file.s-o文件编译即可

这对我很管用。然后
/file
为了运行可执行文件

这似乎是Windows错误。我也有同样的问题,但不知道如何解决。 在linux上尝试完全相同的方法是有效的

对于x64和nasm:

nasm -f elf64 -o <asm_name>.o <asm_name>.asm
nasm-f elf64-o.o.asm
如果您使用的是c程序调用它,请遵循以下步骤:

gcc -m64 -o <c_name> <c_name>.c <asm_name>.asm
gcc-m64-o.c.asm
最后,您可以使用
/


我知道,这不是你问题的真正解决方案,但至少是一种可行的方法。

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

创建对象文件后:
gcc-g-O-c main.c functions.c

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


抱歉,我不知道汇编,所以我不知道这是否适用于OP。希望这对其他人有所帮助。

使用“gcc-m32 cmp.S-o cmp”编译给我一个链接器错误的巨大列表,如:/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../../../../x86_64-pc-cygwin/bin/ld:跳过不兼容的/usr/lib/gcc/x86_64-pc-cygwin/4.8.2//libgcc_.dll.a在搜索-lgcc_时,我相信您还需要指定一个链接器选项。类似于
-mi386pe
的东西。要从GCC传递它,可以使用
-Wl,-mi386pe
@DrewMcGowen谢谢,我找到的选项是-Wl,-mi386pep。我得到了与第一篇文章相同的两个错误,但有一些新错误:/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../../../../lib/libcygwin.a(libcmain.o):在函数
main':/usr/src/debug/cygwin-1.7.25-1/winsup/cygwin/cygwin/libcmain.c:39中未定义的引用(.text.startup+0x7e):针对未定义的符号“WinMain”的重新定位被截断以适合:R_X86_64_PC32确定,因此这行代码似乎导致了重新定位错误:movl数据项(,%edi,4),%eax。但这不是一行有效的代码吗?我仍然坚持这一点,我正在寻找一个解决方案…有人能提供一些帮助吗?请不要添加。回答最好的一个,并标记为重复的,一旦你赢得了足够的声誉。如果不是重复的,就根据问题定制帖子。听起来更像是你有问题如果您在Windows上遇到R_X86_64_32S重新定位错误,如果您的gcc配置为默认的
-pie
(就像在最新的发行版上一样),您在Linux上也会遇到这些错误。这是一个显而易见的解决方案,或者在Windows上创建一个非pie可执行文件。(首先假设您实际上有64位代码,而不是在这个问题中,32位寻址模式是一个线索,表明它适用于32位模式。)。不,这一点用处都没有。在许多设置中,使用默认的
-m64
编译会导致此代码出现此错误,因为它是为32位模式编写的。如果您的实际64位代码出现此错误,则此答案没有帮助。此外,您不需要单独编译为
.o
,您只需
gcc-g-O3即可-o prog*.c