Assembly 用于arm的NetBSD上组件的GNU作为ld标志

Assembly 用于arm的NetBSD上组件的GNU作为ld标志,assembly,raspberry-pi,gnu-assembler,netbsd,Assembly,Raspberry Pi,Gnu Assembler,Netbsd,我正试图在运行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

我正试图在运行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

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


感谢您的帮助。

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

试着给这个提示,看看幕后发生了什么:

$ cc -v -o hllwrld hllwrld.o
Klaus的文章应该为您的系统提供足够的细节线索,但您可能还想看看NetBSD/i386和amd64的工作示例:


如果在emacs中打开文件并批准本地变量设置,则
编译命令
将被设置为将在兼容的NetBSD系统上汇编、链接和运行示例程序的命令行。

aarch64和arm64是同义词。将
文件/hllwrld
文件/bin/ls
(或任何其他已知的可执行文件)进行比较可能是一个好主意,以查看NetBSD系统需要哪种类型的可执行文件。(由于您链接了一个静态可执行文件,因此可能会出现一些差异,但显示这些差异可能会让某些人帮助您,即使他们在ARM上不使用NetBSD)可能是错误地设置了ELF解释器路径。@fuz:可能,但在Linux上会导致
execve
返回
-enoint
,因此shell将打印出来“没有这样的文件或目录“.BSD可能会有所不同。当然,只有在没有任何库选项的情况下,
ld
默认为该系统上的动态链接时,这才可能实现。如果您实际包含该命令,而不是仅链接到它,这将是一个更好的答案。在以
fn
作为基名的emacs LISP中,它执行以下字符串连接:
“as-o“fn”.o“fn”.s&&ld-Bstatic-o“fn”/usr/lib/sysident.o“fn”.o&&&/.fn
。IDK为什么必须链接一个
sysident.o
文件没有人通过剪切和粘贴来学习——甚至我也没有!o提供了ELF头的定义,这就是为什么好的答案会提供实际答案(而不是答案的链接)和解释。或者你是想教人们如何使用谷歌(google)作为例子?我认为在这个地方,我们需要更多的这两种方法(例如,教人们如何自己找到答案,有时甚至给出完全的答案)。毕竟这不是维基百科(尽管我真的希望它更像维基百科)。此外,我真的不认为我能在克劳斯给出的答案的基础上有所改进,因为我目前还没有一台运行的ARM机器来测试一个明显完整的答案。