【发布时间】: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
稍后我检查这些值时,发现它们是奇数,例如0x080004b9 或0x08001de3。实际功能在这些地址的可执行文件的反汇编中显示,但相差一个:
080004b8 <_ZN6ia_euc7process24process_entry_trampoline17h475c405f87caeb6aE>:
80004b8: b5d0 push {r4, r6, r7, lr}
80004ba: af02 add r7, sp, #8
所以当我跳转到这些地址时,会发生奇怪的事情,我怀疑这是因为地址不是半字对齐的。为什么会发生这种情况,在使用之前清除地址的最后一位是否一定安全?
我正在以 Thumb 模式在 ARMv7 (Cortex-M4F) 芯片上编程。
【问题讨论】: