我的一个朋友问我这个问题,我不知道这个函数的含义。也许就像他们上面的注释一样/* sign-extend to 32 bits */
。但我想知道这个函数如何实现角色“符号扩展至32位”的细节。
来自 Linux 内核的函数。谢谢大家。
就像@unwind 所说,函数的完整定义是这样的:
/* Convert a prel31 symbol to an absolute address */
#define prel31_to_addr(ptr) \
({ \
/* sign-extend to 32 bits */ \
long offset = (((long)*(ptr)) << 1) >> 1; \
(unsigned long)(ptr) + offset; \
})
它将在函数中使用:
int __init unwind_init(void)
{
struct unwind_idx *idx;
/* Convert the symbol addresses to absolute values */
for (idx = __start_unwind_idx; idx < __stop_unwind_idx; idx++)
idx->addr = prel31_to_addr(&idx->addr);
pr_debug("unwind: ARM stack unwinding initialised\n");
return 0;
}