【问题标题】:GNU as ld flags for assembly on NetBSD for armGNU 作为 ld 标志,用于在 NetBSD for arm 上进行组装
【发布时间】:2021-08-06 09:58:29
【问题描述】:

我正在尝试在运行 NetBSD 9.1 的 Raspberry Pi 3 B+ 上使用 GNU 汇编器 (as) 组装一个简单的 Hello World 程序
我需要向 as 或 ld 添加哪些标志才能使它们为我正在使用的架构正确组装代码?

$ as -o hllwrld.o hllwrld.s
$ ld -o hllwrld hllwrld.o
$ ./hllwrld
-sh: Cannot execute ELF binary ./hllwrld

$ uname -a
NetBSD rpi 9.1 NetBSD 9.1 (RPI) #0: Sun Oct 18 19:24:30 UTC 2020  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/RPI evbarm

这是 aarch64 还是 arm64?

我知道有手册页,但我只是在学习汇编,所以我什至不知道我什至需要寻找哪些配置/标志/参数。

感谢您的帮助。

【问题讨论】:

  • aarch64 和 arm64 是同义词。将file ./hllwrldfile /bin/ls(或任何其他已知工作的可执行文件)进行比较以查看您的NetBSD 系统需要什么样的可执行文件可能是个好主意。 (由于您链接了静态可执行文件,因此会出现一些差异,但显示差异可能会让某人帮助您,即使他们不在 ARM 上也使用 NetBSD)
  • 可能是错误设置的 ELF 解释器路径。
  • @fuz:可能,但在 Linux 上会导致 execve 返回 -ENOENT,因此 shell 会打印“没有这样的文件或目录”。不过,BSD 可能会有所不同。当然,只有在没有任何库选项的 ld 在此系统上默认为动态链接时,这才有可能。

标签: assembly raspberry-pi gnu-assembler netbsd


【解决方案1】:

这可能由于多种原因而失败,所有这些都归结为缺少 ld 的参数和/或标志,并且可能包括运行时链接器信息、启动代码和库。

试一试,看看幕后发生了什么:

$ cc -v -o hllwrld hllwrld.o

【讨论】:

    【解决方案2】:

    Klaus 的 answer 应该为您的系统提供足够的线索,但您可能还想查看 NetBSD/i386 和 amd64 的工作示例:

    github.com/robohack/experiments: thello.s

    如果您在 emacs 中打开文件并批准局部变量设置,则 compile-command 将设置为命令行,该命令行将在兼容的 NetBSD 系统上组装、链接和运行示例程序。

    【讨论】:

    • 如果您实际包含该命令,而不仅仅是链接到它,这将是一个更好的答案。在以fn 为基本名称的emacs LISP 中,它正在执行此字符串连接:"as -o " fn ".o " fn ".s && ld -Bstatic -o "fn " /usr/lib/sysident.o " fn ".o && ./" fn。 IDK 为什么需要链接sysident.o 文件
    • 没有人通过剪切和粘贴来学习——甚至我也不知道! sysident.o 提供 ELF 头定义
    • 对,这就是为什么好的答案可以提供实际答案(不是答案的链接),解释。还是您想教人们如何使用 Google 搜索示例?
    • 我认为我们在这个地方需要更多的两者(即教如何自己寻找答案以及有时公然给出完整的答案)。毕竟这不是维基百科(尽管我真的希望它更像维基百科)。此外,我真的不认为我可以改进 Klaus 给出的答案,因为我目前没有运行中的 ARM 机器来测试一个公然完整的答案。
    猜你喜欢
    • 2016-03-06
    • 2010-10-10
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多