Linux-Kernel
在 arm64 架構的 entry.S 中如何包含 overflow_stack 變數?
該
overflow_stack
變數在arch/arm64/kernel/entry.Skernel_ventry
的宏中使用/* Switch to the overflow stack */ adr_this_cpu sp, overflow_stack + OVERFLOW_STACK_SIZE, x0
在我看來,是在arch/arm64/include/asm/stacktrace.h中聲明的
DECLARE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)], overflow_stack);
但是,此標頭檔不包含在 entry.S 或我能找到的任何其他有意義的標頭檔中。是否有另一種方式將其包含在內?
不,沒有別的辦法;
overflow_stack
沒有在 . 包含的任何標頭檔中聲明或定義entry.S
。但就彙程式序而言,這不是錯誤;overflow_stack
沒有本地前綴,因此它最終成為 中的未定義符號arch/arm64/kernel/entry.o
,在連結核心時解決。跑
make arch/arm64/kernel/entry.o
(或
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 arch/arm64/kernel/entry.o
在 以外的架構上arm64
);然後objdump -t arch/arm64/kernel/entry.o
將顯示(除其他外)
0000000000000000 *UND* 0000000000000000 overflow_stack
重定位表包括多個用於
overflow_stack+0x0000000000001000
(overflow_stack + OVERFLOW_STACK_SIZE
) 的條目;跑去objdump -r arch/arm64/kernel/entry.o
看他們。