gpt4 book ai didi

assembly - 如何使用汇编制作小型二进制文件?

转载 作者:行者123 更新时间:2023-12-02 21:44:33 25 4
gpt4 key购买 nike

我正在为我的一些项目编写一些汇编代码,我看到了一些有趣的东西。链接时二进制文件的大小非常大。所以我测试了又测试,即使使用尽可能少的代码行,输出的 Elf 二进制文件也很大。例如:

.section .text
.global _start
_start:
movl $1,%eax
movl $0,%ebx
int $0x80

组装并链接以上代码后,结果二进制文件超过 4kb!有趣的是,大部分二进制文件都用零填充。
我尝试了很多方法来找出失败的原因。
有人可以向我解释一下这里有什么问题吗?

我只是组装并链接文件:

as -o <OBJ_NAME> <SOURCE NAME>
ld -o <ELF_NAME> <OBJ_NAME>

推荐任何形式的资源以供进一步阅读都会很好。

正如你可能猜到的,我使用 64 位 GNU/Linux

谢谢。

最佳答案

这与对齐有关。请参阅readelf -eW <ELF_NAME> 。有趣的是

Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 0000000000401000 001000 00000c 00 AX 0 0 1

注意 Off柱子。这是文件中的偏移量,.text部分以 0x1000 开头,即 4K。

如果您查看程序标题,会看到相同的图片。填充零的空间位于 ELF header 末尾和 0x1000 之间。

这是为什么?

首先,因为 ELF 标准规定

Loadable process segments must have congruent values for p_vaddr and p_offset, modulo the page size.

(参见man elf)。您的系统(我的系统)上的页面大小是 4K。这是您在 p_align 中看到的值.

其次,链接器分配给“文本”段开头的虚拟地址 - 与 .text 相同。此处的部分,因为这就是该部分包含的全部内容 - 是 0x0000000000401000 。因此,文件中“文本”段偏移量的十六进制表示必须以 000 结尾。 。但是 0 已经被包含 ELF header (文件的最开头)的只读段占用。第二个选择是0x1000 .

为什么链接器选择 0x401000 作为文本部分的虚拟地址?我不知道。我认为,如果稍微调整链接器脚本,您将能够得到更小的结果可执行文件。

<小时/>

正如 Peter 和其他人指出的那样,可以使用 -n 禁用页面大小对齐。链接器选项:

'-n'
'--nmagic'
Turn off page alignment of sections, and disable linking against
shared libraries[…]

这样我就得到了

Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 1] .text PROGBITS 0000000000400078 000078 00000c 00 AX 0 0 1

Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000078 0x0000000000400078 0x0000000000400078 0x00000c 0x00000c R E 0x1

可执行文件的大小降至 664 字节(strip ping 后为 344 字节)。

<小时/>

通过 GNU ld,您可以使用链接器脚本来精细控制链接器输出文件的布局。 ld.bfd (通常也称为 ld )如果用户未指定,则解释默认链接器脚本。可以通过 ld --verbose 获得。然后,您可以编辑它并提供您的版本,而不是使用 -T <your-script> 的默认版本。 .

我删除了第一次出现的

. = ALIGN(CONSTANT (MAXPAGESIZE));

(在 .text 之前)并获得 720(在 strip ped 时为 400)字节。这与使用-n的结果不同。选项。您仍然获得 2 个可加载段,以及它们的 p_align仍然是0x1000 .

拥有p_align会对效率产生影响<MAX_PAGE_SIZE我不完全明白。 (由于地址计算更困难,页面加载速度不会那么快?我认为应该有更好的解释。)如果您了解更多相关信息或解释位置,请随意编辑答案。

关于assembly - 如何使用汇编制作小型二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56957037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com