代码之家  ›  专栏  ›  技术社区  ›  laptou

为什么fn指针不与半单词边界对齐?

  •  1
  • laptou  · 技术社区  · 4 年前

    我使用以下代码获取函数指针并将其存储为 usize s:

    let mut stack_mem = vec![0usize; stack_size];
    let entry: unsafe extern "C" fn(*mut Box<F>) = process_entry_trampoline::<F>;
    stack_mem[stack_size - 2] = entry as usize; // PC
    let exit: extern "C" fn() = process_exit;
    stack_mem[stack_size - 3] = exit as usize; // LR
    

    当我稍后检查这些值时,我发现它们是奇数,例如 0x080004b9 或 0x08001de3 . 实际函数显示在这些地址的可执行文件的反汇编中,但按一个:

    080004b8 <_ZN6ia_euc7process24process_entry_trampoline17h475c405f87caeb6aE>:
     80004b8:   b5d0        push    {r4, r6, r7, lr}
     80004ba:   af02        add r7, sp, #8
    

    所以当我跳转到这些地址时,奇怪的事情发生了,我怀疑这是因为地址没有半个字对齐。为什么会发生这种情况?在使用它之前只清除地址的最后一位是否一定安全?

    我正在ARMv7(Cortex-M4F)芯片上以拇指模式编程。

    1 回复  |  直到 4 年前
        1
  •  1
  •   laptou    4 年前