assembly 将组装件与4K块末端对齐

mcvgt66p  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一些汇编。我希望它在一个4K块的末尾。目前该部分被放在0x1000003C0,我希望它位于0x100003F80。
我尝试使用p2align,但它似乎没有把它放在4K块的末尾。

5vf7fwbs

5vf7fwbs1#

如果您知道先前的4k对齐点,则可以执行此操作,但这些工具无法轻松避免浪费大量空间。

.balign  4096
pagestart:            // a page-aligned reference at some earlier point.
        nop
        .skip 5680
        nop           // some arbitrary amount of code after it, perhaps more than a page.

 .skip 4096 - (. - pagestart) % 4096 - blocksize    // pad to blocksize before end of page
blockstart:
        add x1, x1, x2
        add x2, x2, x3
// 4k boundary here
blockend:
.equ blocksize, blockend - blockstart
        nop         // more code

一月一日与一月一日

foo.o:  file format elf64-littleaarch64     (I'm on GNU/Linux, not MacOS)

foo.o:  file format elf64-littleaarch64

Disassembly of section .text:

0000000000000000 <pagestart>:
       0: 1f 20 03 d5   nop

0000000000000004 <$d.1>:              // placeholder for actual code
       4:       00 00 00 00     .word   0x00000000
       8:       00 00 00 00     .word   0x00000000
       ...
    1630:       00 00 00 00     .word   0x00000000

0000000000001634 <$x.2>:
    1634: 1f 20 03 d5   nop         // end of actual code

0000000000001638 <$d.3>:            // padding for alignment of blockend
    1638:       00 00 00 00     .word   0x00000000
    ...
    1ff0:       00 00 00 00     .word   0x00000000
    1ff4:       00 00 00 00     .word   0x00000000

0000000000001ff8 <blockstart>:
    1ff8: 21 00 02 8b   add     x1, x1, x2
    1ffc: 42 00 03 8b   add     x2, x2, x3

0000000000002000 <blockend>:       // note 4k alignment
    2000: 1f 20 03 d5   nop

所以这需要0到4092字节的填充,取决于块的大小。这些大小需要是汇编时常量,而不仅仅是链接时**,因为我不认为重定位条目可以表达%模。或者即使没有它,也可能不表达减法和变量大小跳过。
这对我在Linux上的clang -target arm64-macos -c foo.s不起作用,所以我不确定它是否可以用于Mach-O 64对象文件。

相关问题