为什么组装的文件这么大?

Why are as-assembled files so big?

提问人:axolotlKing0722 提问时间:10/27/2023 最后编辑:CherryDTaxolotlKing0722 更新时间:10/27/2023 访问量:34

问:

我对汇编和低级编码很陌生,但我在 Google 上找不到任何有价值的东西,所以也许有人可以解释为什么一个简单的 Hello World ARM64 脚本在我的 Mac 上需要 17KB。

我正在使用 Apple Mac Mini M1,并开始在 OS-Dev 教程中学习一些组装。在那里,使用了 NASM x86 汇编,它非常简单,代码只是用普通的 NASM 编译的,没有任何交叉编译器的东西。本教程从一个使用 BIOS 中断的 Hello World 程序开始,输出文件非常小,基本上汇编指令表示为字节,就像您期望的那样。

现在,我尝试在我的 Mac 上使用汇编进行编码,在网络的黑暗中找到一些关于 ARM64 和 M1 汇编的有用说明后,我编写了您在下面看到的 hello world 程序。我用命令编译了它,输出文件很奇怪。as

它包含一些字符串,如 ,以及程序集源代码中断点的名称。它们的用途是什么?为什么NASM编译的程序不需要它?仅仅将参数移动到寄存器中并调用0x80中断还不够吗?__TEXTltmp0

但这甚至不是最终的输出文件,它是目标代码,所以我不得不链接它,最终程序(真正打印“Hello World!”到我的终端)的大小高达17KB。仅用于设置 、 和 、 、 调用中断并存储 Hello World 字符串。那东西是干什么用的?为什么大约 15KB 的文件由 0x00 字节组成?axbxcxdx__mh_execute_header__unwind_info/usr/lib/libSystem.B.dylib

我知道有些东西取决于我的操作系统和系统库或其他什么,但我的 MacOS 真的需要所有 17KB 和字符串才能将“Hello World!”打印到终端吗?为什么在 x86 linux 上也做这些疯狂的事情,而 macOS 和 Linux 上的 nasm 只提供简单的代码?这真的是我的代码运行所必需的,还是有什么方法可以避免它?as

感谢您的回答!

ARM 汇编代码:

.global _main
.align 2

_main:
    mov X0, #1
    adr X1, hello
    mov X2, #13
    mov X16, #4
    svc #0x80

    mov X16, #1
    mov X0, #0
    svc #0x80

hello: .ascii "Hello World!\n"
Linux 程序集 级代码

评论

5赞 fuz 10/27/2023
它不是脚本,而是可执行文件或二进制文件(脚本用于可以传递给解释器的文本文件)。另请注意,程序集是组装的,而不是编译的。NASM 是一个汇编程序,而不是编译器。如果你看一下对象文件,你会发现大部分空间都是填充的。这是必需的,因为二进制文件中的部分必须与页面 (16 kB) 对齐。
0赞 Peter Cordes 10/27/2023
相关新闻: 链接后,最小可执行文件大小现在比 10 年前大 2 倍,用于微型程序? 回复:x86-64 Linux 和可执行文件中的填充

答: 暂无答案