赞
踩
我们需要准备好vmlinux.lds.S文件,文件的位置是arch/arm64/kernel/vmlinux.lds.S。我们还可以查看该文件预处理后的连接文件,在编译完linux内核会自动生成文件是arch/arm64/kernel/vmlinux.lds。我们还可以使用下面的命令读取 vmlinux 文件中的各段地址,协助我们分析:
readelf -S vmlinux > vmlinux_elf.txt
我们先直接查看预处理好的vmlinux.lds文件,可以看到开头就是下面这几行代码,这些是连接文件的参数,在vmlinux.lds.S中也可以找到一模一样的,只是放在了不同的行中而已:
OUTPUT_ARCH(aarch64)
ENTRY(_text)
jiffies = jiffies_64;
PECOFF_FILE_ALIGNMENT = 0x200;
OUTPUT_ARCH(aarch64):这行指定输出文件的目标架构是 aarch64,即 64 位 ARM 架构。这是告诉链接器生成适用于 ARM 64 位处理器的内核映像。
ENTRY(_text):这行指定了内核的入口点是 _text 符号。_text 通常是一个在内核代码中定义的标签,指向内核启动时第一条要执行的指令。这意味着当内核加载到内存并跳转到它的入口点时,它将开始执行 _text 标签指定的代码。
jiffies = jiffies_64;: 在标准的 Linux 内核构建系统中,jiffies 作为变量通常是在 C 代码中定义和使用的。这行代码看起来像是一个赋值操作,但是在文件中没有使用到,个人猜测这是表示使用64位的jiffies。
PECOFF_FILE_ALIGNMENT = 0x200;:这行设置了 PECOFF(Portable Executable for Console File Format)文件的对齐字节。PECOFF 是一种常用于 Windows 系统的文件格式,但在某些交叉编译场景下,Linux 内核可能需要以这种格式生成,以便于在某些环境中加载和执行。0x200 表示每个文件节(section)在磁盘上以 512 字节对齐,这是一个常见的对齐设置,用于优化文件的加载和内存访问性能。
/DISCARD/ : {
ARM_EXIT_DISCARD(EXIT_TEXT)
ARM_EXIT_DISCARD(EXIT_DATA)
EXIT_CALL
*(.discard)
*(.discard.*)
*(.interp .dynamic)
*(.dynsym .dynstr .hash .gnu.hash)
*(.eh_frame)
}
预处理后变成:
/DISCARD/ : {
*(.exitcall.exit)
*(.discard)
*(.discard.*)
*(.interp .dynamic)
*(.dynsym .dynstr .hash .gnu.hash)
*(.eh_frame)
}
结合英文注释和网上的一些言论,个人猜测/DISCARD/ 段是一个特殊的指令,用于指示链接器在生成最终的内核映像时应该忽略或丢弃某些段。这样子gcc可以通过配置来确定是否丢弃这些段,可以减小最终映像的大小或移除调试信息从而优化内核的加载时间和内存占用。如果确定丢弃,这意味着这些段不会出现在最终的程序或内核的内存映像中。
. = KIMAGE_VADDR + TEXT_OFFSET;
.head.text : {
_text = .;
HEAD_TEXT
}
预处理后变成:
. = ((((((((0xffffffffffffffff)) - (((1)) << (48)) + 1) + (0)) + (0x08000000))) + (0x08000000))) + 0x00080000;
.head.text : {
_text = .;
KEEP(*(.head.text))
}
**.head.text
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。