如何与缓存线GCC ldr pc相对对齐

如何与缓存线GCC ldr pc相对对齐,gcc,arm,Gcc,Arm,在ARM中,GCC使用PC相对加载,通常用于将常量加载到寄存器中。其思想是相对于加载常量的指令存储常量。例如,以下指令可用于从地址PC+8+偏移量加载常数 ldr r0, [pc, #offset] 因此,.text段将指令和数据交错。后者通常存储在函数代码的末尾。例如 00010860 <call_weak_fn>: 10860: e59f3014 ldr r3, [pc, #20] ; 1087c <call_weak_fn+0x1c

在ARM中,GCC使用PC相对加载,通常用于将常量加载到寄存器中。其思想是相对于加载常量的指令存储常量。例如,以下指令可用于从地址PC+8+偏移量加载常数

ldr r0, [pc, #offset]
因此,.text段将指令和数据交错。后者通常存储在函数代码的末尾。例如

00010860 <call_weak_fn>:
10860:       e59f3014        ldr     r3, [pc, #20]   ; 1087c <call_weak_fn+0x1c>
10864:       e59f2014        ldr     r2, [pc, #20]   ; 10880 <call_weak_fn+0x20>
10868:       e08f3003        add     r3, pc, r3
1086c:       e7932002        ldr     r2, [r3, r2]
10870:       e3520000        cmp     r2, #0
10874:       012fff1e        bxeq    lr
10878:       e1a00000        nop                     ; (mov r0, r0)
1087c:       00089790        muleq   r8, r0, r7
10880:       00000074        andeq   r0, r0, r4, ror r0
00010860:
10860:e59f3014 ldr r3,[pc,#20];1087c
10864:e59f2014 ldr r2,[pc,#20];10880
10868:e08f3003添加r3,pc,r3
1086c:e7932002 ldr r2[r3,r2]
10870:e3520000 cmp r2,#0
10874:012fff1e bxeq lr
10878:e1a00000 nop;(mov r0,r0)
1087c:00089790 muleq r8、r0、r7
10880:00000074 andeq r0、r0、r4、ror r0
对于一个研究项目,我想确保代码和常量永远不会驻留在同一缓存线上(即块64字节对齐)。
是否可以对齐GCC生成的常量?

如果使用编译器的汇编输出,而不是反汇编的二进制文件,会容易得多。使用
gcc-S
生成程序集输出。您还将看到
.align
汇编指令,这些指令应该会对您有所帮助。我遵循您的建议。不幸的是,这意味着我必须用脚本修补生成的程序集。