define 되어있는 부분들을 수정해서 아래와 같이 치환해두었습니다.
static const struct kernel_symbol __ksymtab_cpu_number __used \
__attribute__((section("__ksymtab" sec), unused)) \
= { (unsigned long)&cpu_number, __kstrtab_cpu_number }
근대, __ksymtab 이라는 희야한 Section을 발견하고, 있나 찾아봤더니 있더군요 ...
대충 의미는 Kernel SYMbol TABle 이겠죠 머 ...
include/asm-generic/vmlinux.lds.h 부분에서 발견했습니다.
#define RO_DATA(align) \
. = ALIGN((align)); \
.rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start_rodata) = .; \
*(.rodata) *(.rodata.*) \
*(__vermagic) /* Kernel version magic */ \
*(__markers_strings) /* Markers: strings */ \
*(__tracepoints_strings)/* Tracepoints: strings */ \
} \
\
.rodata1 : AT(ADDR(.rodata1) - LOAD_OFFSET) { \
*(.rodata1) \
} \
\
\
BUG_TABLE \
(중략)
TRACEDATA \
\
/* Kernel symbol table: Normal symbols */ \
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___ksymtab) = .; \
*(__ksymtab) \
VMLINUX_SYMBOL(__stop___ksymtab) = .; \
}
질문 사항들
1. 이부분에서 BUG_TABLE이라던지 TRACEDATA는 무엇을 하는 부분입니까 ?
그리고 BUG_TABLE과 TRACEDATA는 어디에 정의되어 있는 겁니까?
2. AT(), ADDR() 은 무엇을 하는 것이고, 어디에 정의되어있는 알고 싶습니다.
3. VMLINUX_SYMBOL(__start___ksymtab) = .; <<<---- 이건 도대체 뭐하는 걸까요 ... ?
*(__ksymtab) <--- 이 부분은 아마도 현재 주소값을 포인팅하는 것이라고 생각됩니다 ?
VMLINUX_SYMBOL(__stop___ksymtab) = .;
정의를 찾아보니 아래와 같이 정의되어있습니다만 ...
#define VMLINUX_SYMBOL(_sym_) _sym_ <<<--- 뭔가 이상한 거라고 생각되네요 ...
또한, 위처럼 표기하면 Memory 구성이 어떻게 하는 겁니까 ?
1. 질문만으로는 소스를 확인해보아야 하니 패스하겠습니다.
2. AT(lma)은 VMA와 LMA가 다를 경우 LMA를 명시해주는 함수입니다.
그리고 ADDR(section)은 섹션의 VMA를 반환하는 함수입니다.
이해가 안되시면 아래 메뉴얼을 참고하시기 바랍니다.
http://korea.gnu.org/manual/release/ld/ld-sjp/
3. __start___ksymtab의 주소를 현재 주소(.)로 하라는 의미입니다.
Memory 구성은 위 링크된 메뉴얼을 보고나면 이해하실 겁니다.