【问题标题】:Linking fails when trying to link a nasm object file [duplicate]尝试链接 nasm 对象文件时链接失败 [重复]
【发布时间】: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 接受了double by XMM reg(AL=1)中的值,而不是指针。

标签: gcc x86 nasm x86-64 ld


【解决方案1】:

正如 Michael Petch 在上述 cmets 中所说,

我希望使用 -static 构建可能会起作用

我遇到了同样的问题,这解决了它。

【讨论】:

  • -no-pie 会是比-static 更好的选择。
  • @PeterCordes 我将不得不检查一下。这是为什么呢?
  • 因为您不需要静态链接 libc,所以如果您查看 objdump -drwC -Mintel 输出,则会使可执行文件变得臃肿并且更难找到您自己的代码。 -no-pie 足以让链接器自动生成 PLT 存根并将 call printf 替换为 call printf@plt。 IDK 为什么不对 PIE 可执行文件执行此操作;也许这是 PIE 可执行文件是某种共享库这一事实的副作用。另见32-bit absolute addresses no longer allowed in x86-64 Linux?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
相关资源
最近更新 更多