①vmlinux.lds.S文件在目录arch/arm/kernel/vmlinux.lds.S下
分析VMLINUX_SYMBOL(__proc_info_begin) = .;
vmlinux.lds.S文件的内容为:
#include <asm-generic/vmlinux.lds.h>
#include <asm/thread_info.h>
#include <asm/memory.h>
#include <asm/page.h>
分别表示include文件夹里的<>目录下的内容。
#define PROC_INFO \
VMLINUX_SYMBOL(__proc_info_begin) = .; \
*(.proc.info.init) \
VMLINUX_SYMBOL(__proc_info_end) = .;
\表示连接符,一个句子太长分开连接的意思,相当于:
相当于PROC_INFO代表后面一长串,包含后面的分号。
VMLINUX_SYMBOL(__proc_info_begin) = .;
因为vmlinux.lds.S文件引入:#include <asm-generic/vmlinux.lds.h>,在目录include/asm-generic/vmlinux.lds.h头文件中有部分内容为:
#ifndef SYMBOL_PREFIX
#define VMLINUX_SYMBOL(sym) sym
#else
#define PASTE2(x,y) x##y
#define PASTE(x,y) PASTE2(x,y)
#define VMLINUX_SYMBOL(sym) PASTE(SYMBOL_PREFIX, sym)
#endif
表示:如果没有定义SYMBOL_PREFIX则#define VMLINUX_SYMBOL(sym) sym
如果定义了SYMBOL_PREFIX则#define PASTE2(x,y) x##y #define PASTE(x,y) PASTE2(x,y)
即PASTE(x,y) PASTE2(x,y)都是等于x##y,x##y表示xy
所以如果定义了SYMBOL_PREFIX,PASTE(SYMBOL_PREFIX, sym)就是 SYMBOL_PREFIXsym
VMLINUX_SYMBOL(__proc_info_begin) 要么是__proc_info_begin,要么是SYMBOL_PREFIX__proc_info_begin
"."特殊符号点,代表定位计数器,表示目前的位