【发布时间】:2017-08-21 01:43:58
【问题描述】:
我有这个简单的程序来计算浮点数的平方根
global main
extern printf
section .data
float_t db '%f',0x0
val dq 123.45
res dq 0x0
section .text
main:
fld qword[val]
fsqrt
fst qword[res]
xor rax,rax
mov rdi, float_t
mov rsi, [res]
call printf
mov rax,60
mov rdi,0
syscall
我组装的
$ nasm -f elf64 fpu.asm -o fpu.o
然后尝试使用 gcc as 链接到 glibc
$ gcc fpu.o -o fpu
GCC 抱怨:
/usr/bin/ld: fpu.o: relocation R_X86_64_32S against `.data' can not be used
when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
【问题讨论】:
-
什么操作系统(Linux)和版本?该错误表明您用于构建可执行文件(使用 GCC)的命令行正在使用
-shared选项。您可以尝试使用-static选项进行构建。我怀疑您使用的是基于 Ubuntu 16.10 及更高版本或最新 Debian(测试版本)的 Linux 发行版。 -
@MichaelPetch 我正在使用 debian sid。
-
是的,我怀疑存在测试或不稳定版本的可能性。 Ubuntu 16.10 及更高版本(以及 Debian 测试和 sid)默认构建与位置无关的对象和可执行文件(在 64 位平台上)。我希望使用
-static构建可能会起作用。 -
@MichaelPetch,这应该是一个(接受的)答案。
-
这个例子有很多问题(你还没有机会调试,因为你在链接上卡住了。)
printf接受了doubleby XMM reg(AL=1)中的值,而不是指针。