Linux内核Makefile执行流程

VSole2023-05-12 09:04:49


一、必备知识

1.1. Makefile基础语法

如果还不熟悉Makefile语法,建议先系统的学习一下,特别是以下几点:

(1) Makefile哪些部分包含的是shell语句:

编译规则中的指令部分

${shell XX},var != XX中的XX部分

$(if …, XX, XX)中的XX部分

(2) 变量展开:

=(延迟赋值)、:=(立即赋值)、!=(值为shell命令)、?=(条件赋值)、+=(追加)

(3) include:将指定的其它Makefile内容,展开到当前Makefile

-f/-C:嵌套执行指定(目录中的)Makefile

执行一个Makefile,并不是从第一行开始执行,而是从指定或默认的编译目标开始执行(位置目标编译规则之前的赋值语句,只在相应变量需要被使用时才会执行),其中,Makefile(包括include内容)中的第一个目标,为默认目标,如果make命令行中没有指定编译目标,则执行默认目标。

(4) 自动推导依赖文件

(5) 根据文件时间戳、中间文件(.d、.cmd),判断依赖更新,决定是否需要重新编译

(6) 重要的内置函数:

$(wildcard pattern)

$(patsubst pattern, replacement, text)

$(strip string)

$(filter pattern, text)

$(filter-out pattern, text)

$(call func, args..)

(7) 自动推导变量:

$@:编译目标

$<:依赖列表中的第一个依赖对象

$^:依赖列表中的所有对象

$?:依赖文件列表中所有有更新的文件

Makefile教程可以参考以下这2个:

深入解析Makefile系列:https://zhuanlan.zhihu.com/p/362640343(简约,直指核心)

跟我一起写makefile(陈皓):https://blog.csdn.net/whitefish520/article/details/103968609(精典,超级详细)

1.2. Kbuild内置函数

Linux内核源码包含一套Makefile程序,本文基于Linux-5.2.5内核源码分析,其中包括top Makefile,scripts/目录下的Makefile、Makefile.build、Makefile.lib、Kbuild.include、Makefile.modpost、kconfig/Makefile等,以及其它目录下的很多子Makefile,统称为Kbuild。Kbuild是按照框架设计思路实现的,使得内核自身包含或外部提供的大量驱动模块,只需要按照Kbuild框架的约定,各自提供一个简单的Makefile即可编译。

所以,理解内核或驱动文件的编译过程,其实就是要理解Kbuild这套Makefile程序的实现逻辑,既然是程序,就免不了会定义一些函数,由于很多关键的流程,都使用了$(build)和$(if_changed),所以以下先单独介绍(本文分析的Makefile内容,来自Linux-5.2.5内核源码):

1.2.1. $(build)

◆使用形式:$(Q)$(MAKE) $(build)=xx目录 [编译目标]

◆build内部过程

◆build作用概括

以下是$(build)的使用形式,以及每个部分的作用:

1.2.2. $(if_changed)

◆使用形式:$(call if_changed, xx)

◆if_changed内部过程

◆if_changed作用概括

以下是$(if_changed)的使用形式,及其参数的含义:

二、编译外部模块

2.1. 涉及Makefile内容

2.2. 概要流程

2.3. 详细流程

三、make menuconfig

3.1. 涉及Makefile内容

3.2. 概要流程

3.3. 详细流程


四、Make [all/_all/modules]

4.1. 涉及Makefile内容

make命令行指定all/_all/modules目标,或者不指定目标时,是为了生成vmlinux文件,而vmlinux目标间接依赖prepare目标,且prepare目标编译规则展开内容比较多,所以以下分开介绍:

◆vmlinux目标

◆prepare目标

4.2. 概要流程

◆vmlinux目标

◆prepare目标

4.3. 详细流程

◆vmlinux目标

◆vmlinuz目标

◆prepare目标

linux系统makefile
本作品采用《CC 协议》,转载必须注明作者和本文链接
现有关于ftrace hook技术的资料大多比较零散,难以学习和实践。本文针对其中一些难点和常见问题的处置进行了整理
一招搞定 Nginx
2022-03-07 08:25:33
安装PCRE库,用于解析正则表达式yum?zlib压缩和解压缩依赖yum?SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是httpsyum?
事件概述 近日,奇安信威胁情报中心监测到一例以在github上发布CVE-2023-35829的POC为名,对安全研究人员进行钓鱼的代码投毒事件。实际上,我们也发现该攻击者早在2017年就有过攻击记录,曾通过伪装成CCK模块,以及钓鱼文档进行后门程序传播。POC代码投毒 攻击者以热度较高的几个漏洞POC为名,在多个代码仓库中植入了针对linux系统的后门程序。在攻击者植入恶意代码的两天后被披露,但是目前包含恶意代码的仓库地址以及其C2仍然处于活跃状态。?
特权模式逃逸和挂载目录逃逸是最常见的逃逸手法。 特权模式逃逸,也就是熟知的--privileged选项启动后容器不受seccomp等机制的的限制,常见利用就是挂载根目录或利用docker.sock创建恶意容器。 而基于容器特权模式逃逸也分不同特权情况,本文总结常见特权模式下不同Capabilities常见对应的攻击手法。
在过去的远程代码调试场景中,需要调试远程服务器上的Lua代码,需要登录服务器,进行代码的编辑。或者将服务器上的代码进行下载,然后编辑后再上传到服务器上。 有了VSCode及SSH远程访问插件,Lua远程Debug插件后,远程调试服务器上的Lua代码变的简单了,只要打开VSC点击要链接访问的服务器,通的VSC的SSH插件访问,省去的了Lua源文件下载、编辑、上传的过程,并且Debug的操作一并可
Kbuild是按照框架设计思路实现的,使得内核自身包含或外部提供的大量驱动模块,只需要按照Kbuild框架的约定,各自提供一个简单的Makefile即可编译。
通过log页面,可以搜索指定的版本进行下载。总的来说docker和VM的编译流程没有太大区别,因为我习惯在VM环境下进行操作,因此下文的编译流程都是在VMware17 Pro中进行操作的。编译流程我是在VMware中编译内核,步骤如下:1.创建一个虚拟机并安装操作系统。
一个最简单的linux kernel rootkit就是一个linux kernel module。
「Rootkit」即「root kit」,直译为中文便是「根权限工具包」的意思,在今天的语境下更多指的是一种被作为驱动程序、加载到操作系统内核中的恶意软件。
依赖于特定硬件环境的固件无法完整模拟,需要hook掉其中依赖于硬件的函数。LD_PRELOAD的劫持对于特定函数的劫持技术分为动态注入劫持和静态注入劫持两种。网上针对LD_PRELOAD的劫持也有大量的描述
VSole
网络安全专家