我使用以下代码获取函数指针并将其存储为
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)芯片上以拇指模式编程。