我最近试图从“从头开始编程”一书中编写“查找最大值”程序。由于我使用的是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
答案 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。希望这对某人有帮助。