基本概念
输入文件: 目标文件或链接脚本文件.
输出文件: 目标文件或可执行文件.
section: 输入文件和输出文件都有section
section组成部分: 名字和大小,section content
例子
SECTIONS
{
. = 0×10000;
.text : { *(.text) }
. = 0×8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
解释一下上述的例子:
. = 0×10000 : 把定位器符号置为0×10000 (若不指定, 则该符号的初始值为0).
.text : { *(.text) } : 将所有(*符号代表任意输入文件)输入文件的.text section合并成一个.text section, 该section的地址由定位器符号的值指定, 即0×10000.
. = 0×8000000 :把定位器符号置为0×8000000
.data : { *(.data) } : 将所有输入文件的.data section合并成一个.data section, 该section的地址被置为0×8000000.
.bss : { *(.bss) } : 将所有输入文件的.bss section合并成一个.bss section,该section的地址被置为0×8000000+.data section的大小.
1. LMA和VMA
LMA: 加载地址,也就是内存或者norflash的物理地址。(运行之前需要把文件从存储介质搬到某个地方).
VMA: 运行地址,也就是程序在内存中运行地址。(内存运行地址),虚拟的。
1.1 LMA和VMA相等
默认LMA=VMA,就是加载地址和运行地址是一样的。
都是虚拟地址。
1.2 LMA和VMA不相等
kernel中通过AT指定LMA,则.vectors 0:AT(__vectors_start),则VMA-=0,LMA=AT(__vectors_start)=0x8063000(objdum -x vmlinux可以查看到)
问题是:
在__vectors_start=0 (在System.tap中),而在vmlinux中查看到AT(__vectors_start)=0x8063000,为什么不等于0?
2. 格式
243 .data : AT(__data_loc) {
244 _data = .; /* address in memory */
245 _sdata = .;
246
247 /*
248 * first, the init task union, aligned
249 * to an 8192 byte boundary.
250 */
251 INIT_TASK_DATA(THREAD_SIZE)
252
253 #ifdef CONFIG_XIP_KERNEL
254 . = ALIGN(PAGE_SIZE);
255 __init_begin = .;
256 INIT_DATA
257 ARM_EXIT_KEEP(EXIT_DATA)
258 . = ALIGN(PAGE_SIZE);
259 __init_end = .;
260 #endif
261
262 NOSAVE_DATA
263 CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
264 READ_MOSTLY_DATA(L1_CACHE_BYTES)
265
266 /*
267 * and the usual data section
268 */
269 DATA_DATA
270 CONSTRUCTORS
271
272 _edata = .;
273 }
进一步展开:
243 .data : AT(__data_loc) {
244 _data = .; /* address in memory */
245 _sdata = .;
246
247 /*
248 * first, the init task union, aligned
249 * to an 8192 byte boundary.
250 */
. = ALIGN(8192); \
*(.data..init_task)
}
从上面看出输出文件的.data的section,刚开始由输入文件的.data…init_task的section组成。
从地址中可以看出.data的section刚开始存放着init_thread_union的变量的内容,变量大小是8K。