【问题标题】:Why are fn pointers not aligned to half-word boundaries? [duplicate]为什么 fn 指针不与半字边界对齐? [复制]
【发布时间】:2022-01-15 07:49:24
【问题描述】:

我正在使用以下代码获取函数指针并将它们存储为usizes:

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

稍后我检查这些值时,发现它们是奇数,例如0x080004b90x08001de3。实际功能在这些地址的可执行文件的反汇编中显示,但相差一个:

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

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

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

【问题讨论】:

    标签: rust arm


    【解决方案1】:

    看起来最后一位实际上是 Thumb 位,将其设置为 0 会停用 Thumb 指令模式(这是 Cortex-M 处理器上唯一允许的模式,所以这会破坏一切)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-19
      • 2014-04-30
      • 2014-06-27
      • 2021-10-05
      • 1970-01-01
      • 2013-01-25
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多