gpt4 book ai didi

c - 重定位被截断以适应 : R_X86_64_32

转载 作者:太空宇宙 更新时间:2023-11-04 05:38:45 24 4
gpt4 key购买 nike

我有一个 C 驱动程序文件,它声明了一个 extern 函数,以便在我的 asm 文件中使用它。我在 Windows 7 x64 机器上。

我用 NASM 用这个命令组装了 asm 文件:

nasm avxmain.asm -f win64 -o avxmain.o

然后我像这样编译了C文件:

gcc avxdriver.c -c -m64 -o avxdriver.o

将它们链接在一起,我运行了:

gcc avxdriver.o avxmain.o -o final

这是我遇到的错误:

avxmain.o:G:\Desktop\CPSC240:(.text+0x50): relocation truncated to fit: R_X86_64_32 against `.bss'

avxmain.o:G:\Desktop\CPSC240:(.text+0xb9): relocation truncated to fit: R_X86_64_32 against `.data'

avxmain.o:G:\Desktop\CPSC240:(.text+0xc2): relocation truncated to fit: R_X86_64_32 against `.data'

avxmain.o:G:\Desktop\CPSC240:(.text+0x14e): relocation truncated to fit: R_X86_64_32 against `.bss'

collect2: error: ld returned 1 exit status


avxdriver.c 文件:

#include <stdio.h>
#include <stdint.h>

extern double avxdemo();

int main()
{
double return_code = -99.9;
printf("%s","This program will test for the presence of AVX (Advanced Vector Extensions) also known as state component number 2.\n");

return_code = avxdemo();

printf("%s %1.12lf\n","The value returned to the driver is ", return_code);
printf("%s","The driver program will next send a zero to the operating system. Enjoy your programming.\n");
return 0;
}

avxmain.asm 文件:

http://pastebin.com/CfnjbpXM

我把它贴在这里是因为它很长,因为教授提供的评论。


我尝试运行 -fPIC-mcmodel=medium 选项。我仍然遇到同样的错误。我完全迷失和困惑,因为这是我应该为我的类(class)运行的示例项目。这个主题对我来说是全新的。我花了大约半天时间搜索这些错误并尝试不同的方法。我只需要指出正确的方向。

最佳答案

问题是一般的 x64 指令不允许在它们的编码中直接使用 64 位地址。有两种解决方法:

  1. 使用movabs rax, symbolNameHere指令设置rax为地址,然后使用[rax]访问数据那个地址。

  2. 使用[rel symbolNameHere]作为操作数;这将创建对 symbolNameHere 的 PC 相对引用。它被编码为 32 位有符号偏移量,无论 rip 执行该指令时的偏移量。

方法 1 允许您在指令中编码绝对地址,而方法 2 是较小的代码(您始终可以执行 lea rax, [rel symbolNameHere] 以获得与方法 1 相同的效果) .

关于c - 重定位被截断以适应 : R_X86_64_32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25314357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com