【问题标题】:Linux Assembly - Could not read symbols: File in wrong format [duplicate]Linux 程序集 - 无法读取符号:文件格式错误 [重复]
【发布时间】:2014-11-16 15:17:15
【问题描述】:

我正在尝试在 linux 服务器上编译一个 asm 程序。我是编写 asm 程序的新手,但我按照学校的教程做了他们所说的一切,但没有成功。

这是我的 hello.asm 文件。

    SECTION .data
msg:    db "Hello World",10
len:    equ $-msg
    SECTION .text
        global main
main:
    mov edx,len
    mov ecx,msg
    mov ebx,1
    mov eax,4
    int 0x80
    mov ebx,0
    mov eax,1
    int 0x80

我使用命令行nasm -f elf hello.asm 编译这个文件,它完全可以正常工作并生成一个目标文件。问题是,当我尝试ld hello.o 时,它说它无法读取文件中的符号并且文件格式错误。

谁能帮助我并告诉我如何编译一个 .asm 文件以便它可以运行?

【问题讨论】:

  • 如果链接到gcc -o hello hello.o 会怎样?
  • 它给了我同样的错误,并告诉我 ld 的返回状态为 1。
  • 尝试:ld -e main -m elf_i386 hello.ogcc -m32 hello.ouname -smr; dpkg --print-architecture; dpkg --print-foreign-architectures(一行命令)说什么?
  • 您是否有机会尝试将 elf32 目标文件与 64 位链接器链接?在这种情况下,您可以通过将-m <emulation> 传递给ld(其中<emulation> 是您在运行ld -V 时获得的名称之一)来设置适当的链接器仿真。

标签: assembly nasm ld


【解决方案1】:

我今天遇到了类似的问题,因为混合了 32 位和 64 位库(这就是我碰巧遇到您的问题的原因)。如果您尝试链接不同类型的库,ld 会抱怨。在 64 位系统上,ld 默认为 64 位。

要指定类型,您应该能够为 32 位指定 ld -m elf_i386gcc -m32。 (或者 gcc -m32 -static -nostdlib 用于静态二进制文件)。

如果您的 asm 源代码可移植到 64 位,您可以使用 nasm -f elf64 汇编为 64 位。但是它可以组装,但在运行时会因截断指针而出错,或者因为the int 0x80 ABI is purely 32-bit而让系统调用返回错误而不是工作。

【讨论】:

  • 回复:您的最后一行:x86_64 系统调用编号与 x86 不同。
  • 谢谢,我已经澄清了。
  • -m elf_i386 代表 ld,或 gcc -m32 -static -nostdlib 代表 gcc。不,您不应该只使用nasm -felf64 将 32 位 asm 源构建为 64 位。如果您使用esp,它可能无法组装(在push ebx 或其他任何地方),或者在运行时出错,或者如果您通过将64 位地址传递给int 0x80 32-bit ABI system calls 将它们截断为32 位,则静默失败
  • 为我工作!!!
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多