Makefile 实例参考

通过将一个 Makefile 从最原始的状态一步步简化,来展现多种常见的 Makefile 语法和技巧。 最初始的形态: 1main: main.o submodule.o utils.o 2 gcc main.o submodule.o util.o -o main 3 4main.o: main.c submodule.h utils.h 5 gcc -g -c main.c -o main.o 6 7submodule.o: submodule.c submodule.h utils.h 8 gcc -g -c submodule.c -o submodule.o 9 10utils.o: utils.c utils.h 11 …

基于 Jenkins 搭建针对内核的 CI

背景简述 目标内核分支:4.4、4.18、4.19、5.10 根文件系统:最后一版非 Stream 的 CentOS 8 架构概述: 制作一份统一的原始 rootfs 镜像; 为每个内核版本各自设立一个 Job,各自拷贝一份原始 rootfs 运行 VM,随后在 VM 内执行编译内核、安装内核、运行测试套以及其他特定内核版本所需的动作。 Jenkins 配置手册 使用清华开源镜像站 。 Jenkins 有普通版(每周一更)和 LTS 版(每 12 周一更),安装包(以 Ubuntu 为例)在清华源上分别保存在 debian/ 和 debian-stable/ 上。下载下来直接安装即可,不用配 apt 啥的,主要是网络代理太麻烦。 安 …

LSM 启动过程

要使能一个 LSM 有两个步骤: 1、该 LSM 的编译选项被打开 各 LSM 代码中都会使用 DEFINE_LSM() 在内核中创建该模块。这个宏的定义如下: 1// include/linux/lsm_hooks.h 2 3#define DEFINE_LSM(lsm) \ 4 static struct lsm_info __lsm_##lsm \ 5 __used __section(".lsm_info.init") \ 6 __aligned(sizeof(unsigned long)) 其实就是创建了一个 struct lsm_info 的实例, …

Git Relevant Operations

Oh My Zsh’s git plugin responds slowly in big repo Add following lines into (local) .git/config or (global) ~/.gitconfig: link 1git config --add oh-my-zsh.hide-status 1 2git config --add oh-my-zsh.hide-dirty 1 Recover from shallow clone 1git fetch --unshallow https://stackoverflow.com/a/6802238 Shallow clone …

动态加载过程与 PLT、GOT 表

(TODO 补充关于编译时重定位、运行时重定位、PLT/GOT 表的背景知识) 本文将展示动态加载的过程,相关函数的地址如何在运行时被重定位,以及 PLT/GOT 表在其中的发挥的作用。以下面这段代码为例: 1#include <stdio.h> 2 3int main() 4{ 5 printf("Hey man!\n"); 6 return 0; 7} 编译 之前着实没想到,为了更好地展现 PLT/GOT 的过程,要在编译这块做这么多额外工作。 首先要添加 -fno-pie 和 -no-pie 两个选项,否则 GOT 里的函数地址会在 main() 执行前就被调整好,原本的过程就体现不出来了。这是从这 …