友達にこの質問をされたのですが、関数の意味がわかりません.上のメモのようなものかもしれませんが、関数が/* sign-extend to 32 bits */
「32ビットに符号拡張する」という役割をどのように実現しているかを詳しく知りたいです.
Linux カーネルからの関数。すべてthx。
@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;
}