Linux-Kernel

在 arm64 架構的 entry.S 中如何包含 overflow_stack 變數?

  • September 8, 2020

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看他們。

引用自:https://unix.stackexchange.com/questions/608052