编译Linux内核生成Image和System.map文件

2023-11-04


<p><span style="font-family: 华文楷体; font-size: 12pt; background-color: rgb(255, 255, 255);">一直想琢磨琢磨Linux内核,便开始看《Linux内核完全注释》,可是发现一头雾水,所以决定先尝试建立一个内核的实验环境,这样更加形象的了解,所以借助oldlinux论坛的帖子,尝试着建立一个Linux的实验环境,开始编译,可是帖子过于久远,内核的版本没变可是gcc编译器的版本已经变了很多,所以在这个过程中遇到很多问题,现在我尽可能的复原现场,然后把错误解决的过程给展示一下。</span></p><p><span style="font-family: 华文楷体; font-size: 12pt; background-color: rgb(255, 255, 255);">内核原版未经过编译的源代码的链接如下:</span></p>

http://pan.baidu.com/s/1qWLmCLe

这个资源是内核原本的未经过编译的文件Linux 0.11版。

介绍一下我的编译环境,用的是RedHat 5 

gcc版本信息如下:


下面进行内核的编译:

先make之后出现了如下的问题:

In file include from init/main.c:9:
include/unistd.h:207: warning: function return types not compatible due to 'volatile'
include/unistd.h:208: warning: function return types not compatible due to 'volatile'
<span style="color:#ff0000;">init/main.c:24: error: static declaration of 'fork' follows non-static declaration
init/main.c:26: error: static declaration of 'pause' follows non-static declaration
include/unistd.h:224: error: previous declaration of ‘pause’ was here
init/main.c:30: error: static declaration of 'sync' follows non-static declaration
include/unistd.h:235: error: previous declaration of 'sync' was here</span>
init/main.c:108: warning: return type of 'main' is not 'int'
make: *** [init/main.o] Error 1

解决方法:

修改 init/main.c 文件:

static inline _syscall0(int,fork) 改为 inline _syscall0(int,fork)
static inline _syscall0(int,pause) 改为 inline _syscall0(int,pause)
static inline _syscall1(int,setup,void *,BIOS)  改为inline _syscall1(int,setup,void *,BIOS)
static inline _syscall0(int,sync)  改为 inline _syscall0(int,sync)

这个问题我在CentOS 6中编译时未出现,CentOS 6中gcc版本信息为:


编译器版本的问题。

然后继续make

之后又出现了新的问题如下:

<span style="color:#ff0000;">exec.c: In function ‘copy_strings’:
exec.c:140: error: invalid lvalue in assignment</span>
make[1]: *** [exec.o] Error 1
make[1]: Leaving directory `/share/linux-0.11-040327-rh9/linux/fs'
make: *** [fs/fs.o] Error 2

解决方法:

进入fs/exec.c中:

140行中的:

 if (!(pag = (char *) page[p/PAGE_SIZE]) && !(pag = (char *) page[p/PAGE_SIZE] = (unsigned long *) get_free_page()))

改成:

if (!(pag = (char *) page[p/PAGE_SIZE]) && !(pag = (char *) (page[p/PAGE_SIZE] = (unsigned long *) get_free_page()))) 

继续make

下面又出现了新的问题如下:

<span style="color:#ff0000;">malloc.c: In function ‘malloc’:
malloc.c:156: error: invalid lvalue in assignment</span>
make[1]: *** [malloc.o] Error 1
make[1]: Leaving directory `/share/linux-0.11-040327-rh9/linux/lib'
make: *** [lib/lib.a] Error 2

解决方法:

进入lib/malloc.c中:

156行中的:

 bdesc->page = bdesc->freeptr = (void *) cp = get_free_page();
改成:

bdesc->page = bdesc->freeptr = cp = get_free_page();

然后继续make

下面又出现新的问题如下:

ld -m elf_i386 -Ttext 0 -e startup_32 boot/head.o init/main.o \
        kernel/kernel.o mm/mm.o fs/fs.o \  
     kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a \  
      kernel/math/math.a \   
     lib/lib.a \      
  -o tools/system 
<span style="color:#ff0000;">kernel/kernel.o: In function `copy_process':(.text+0x16f4): undefined reference to `memcpy'</span>
make: *** [tools/system] Error 1

解决方法:

在kernel/fork.c中:

查询到copy_process()函数,然后进行修改:

p = (struct task_struct *) get_free_page();
if (!p)
        return -EAGAIN;
task[nr] = p;
*p = *current;  /* NOTE! this doesn't copy the supervisor stack */
p->state = TASK_UNINTERRUPTIBLE;
改成:

p = (struct task_struct *) get_free_page();
if (!p)
    return -EAGAIN;
task[nr] = p;
#if 0
*p = *current;  /* NOTE! this doesn't copy the supervisor stack */
#else
{
    unsigned char *p1,*p2;
    int i;

    p1=(unsigned char*)p;
    p2=(unsigned char*)current;
    for(i=0;i<sizeof(*p);i++)
    {
        *p1++=*p2++;
    }
}
#endif  
p->state = TASK_UNINTERRUPTIBLE;

下面继续make:

出现新的问题如下:

tools/build.c: In function 'main':
tools/build.c:75: warning: implicit declaration of function 'MAJOR'
tools/build.c:76: warning: implicit declaration of function 'MINOR'
tmp/ccsMKTAS.o: In function 'main':
<span style="color:#ff0000;">build.c:(.text+0xe1): undefined reference to 'MAJOR'
build.c:(.text+0xf7): undefined reference to 'MINOR'</span>
collect2: ld returned 1 exit status   

解决办法:   
在 include/linux/fs.h 中


#define MAJOR(a) (((unsigned)(a))>>8)
#define MINOR(a) ((a)&0xff)   

而在 tools/build.c 中也有包含 #include <linux/fs.h>
那么再看第一层目录中的主 Makefile 文件

tools/build: tools/build.c
$(CC) $(CFLAGS) \
-o tools/build tools/build.c

好象确实没有引用头文件

简单的添加 -Iinclude 
重新编译后出现一堆报标准C库头文件的错误

再添加 -nostdinc 
又报 stderr fprintf 之类的错误
只好将
#define MAJOR(a) (((unsigned)(a))>>8)
#define MINOR(a) ((a)&0xff) 
添加到 tools/build.c 文件中,然后删除 #include <linux/fs.h>

引用自:

http://www.cnblogs.com/hummersofdie/p/3645218.html 

在make一下就生成了Image 和System.map文件,为下一步操作提供基础。

接下来的操作还在研究,待续。。。

最后把我自己编译生成的文件分享一下:

http://pan.baidu.com/s/1hdDl8

















本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译Linux内核生成Image和System.map文件 的相关文章

随机推荐

  • 如何在微信小程序中生成二维码:一个最简单的案例就让你明白

    使用weapp qrcode js 在 微信小程序 中 快速生成二维码 一 效果 二 具体步骤 代码 下载weapp qrcode代码 然后 将 dist 目录下的weapp qrcode esm js 复制到项目目录中 这里是utils目
  • 泰勒公式的展开细节解析(转载)

    转载自 https blog csdn net dog250 article details 76697167 上周写完了 三体 读后思考 泰勒展开 维度打击 黑暗森林 后收到一些邮件 进一步思考了关于泰勒展开的意义 也许我掌握的那些网络技
  • [4G&5G专题-5]:RRU 全面了解什么是4G+5G RF动态频谱共享?

    前言 建议在了解动态频谱DSS之前 前先了解 5G专题 4 RRU 全面了解什么是4G 5G RF静态射频共享 4G 5G专题 4 RRU 全面了解什么是4G 5G RF静态射频共享 文火冰糖的硅基工坊的博客 CSDN博客 rru设计原理与
  • 安卓在ecplise的问题

    Description Resource Path Location Type AndroidManifest xml file missing This is build issue Go to Menu in eclipse Proje
  • 【编程测试题】头条校招

    题目描述 头条的2017校招开始了 为了这次校招 我们组织了一个规模宏大的出题团队 每个出题人都出了一些有趣的题目 而我们现在想把这些题目组合成若干场考试出来 在选题之前 我们对题目进行了盲审 并定出了每道题的难度系统 一场考试包含3道开放
  • 用python实现简易控制台五子棋小游戏

    finish False 游戏是否结束 flagNum 1 当前下棋者标记 flagch 当前下棋者棋子 x 0 当前棋子的横坐标 y 0 当前棋子的纵坐标 print 033 1 37 41m 简易五子棋游戏 控制台版 033 0m 棋盘
  • python生成器的实现及原理

    1 迭代 一个接一个读取列表中的值 这个过程叫迭代 案例 mylist1 1 2 3 for v in mylist1 print v end print mylist2 x x for x in range 5 for v in myli
  • STM32F103(六)——定时器中断

    定时器原理与例程 1 定时器基本原理 1 1 三种定时器的区别 1 2 通用定时器的主要特点 1 3 通用定时器的3种计数器模式 1 4 通用定时器工作过程 1 5 定时器的内部时钟配置 2 定时器中断实验 2 1 常见库函数 2 2 定时
  • Notepad++正则命令全解 -- 小黑超细详解

    notepad 为文本编辑器工具 是windows的一款免费开源工具 功能有很多吧 还可以运行脚本 倒是也没有具体去研究 不过用起来挺方便的 记录一下平常使用会用到的吧 下载 Notepad GitHub 目录 举一个栗子 简单使用正则 正
  • Qt中多个单选按钮信号连接到同一个槽函数

    当多个类似信号需要连接到同一个槽函数时 在槽函数内需要对信号的来源进行判断 这里主要是采用sender 函数 此函数会返回信号来源的方向 让我们来看看效果 接下来是具体的代码 首先添加3个RadioButton 并且连接到同一个槽函数 QS
  • 软件工程——第13章软件项目管理知识点整理(完结)

    本专栏是博主个人笔记 主要目的是利用碎片化的时间来记忆软工知识点 特此声明 文章目录 1 管理的定义 2 软件项目管理地位 重要性
  • 【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)

    restful是web编程里重要的概念 一种接口规范也是一种接口设计风格 设计接口 要考虑 数据返回 接收数据的方式 url 方法 统一风格 rest 表现层状态转移 web 每一类数据 资源 资源通过http的动作来实现状态转移 GET
  • iframe 相互获取值

    链接 https www cnblogs com henuyuxiang p 7427155 html
  • Hp 笔记本开机不进入 grub 引导 ubuntu与windows选择界面

    我在预装了 windows 的机器上安装 ubuntu 每次想启动 ubuntu 时都需要按下 F9 才能进入引导选择界面 使用 ubuntu 的 efibootmgr 和 boot repair 等工具都不起作用 只是改变了 ubuntu
  • git常规操作

    场景一 从项目A的dev分支复制到项目B的dev分支上 1 将项目B clone 到本地 git clone b master 项目B的git地址 2 将项目A的git地址 添加至本地的remote git remote add upstr
  • 每月摘录--2023年7月

    企业 证监会最新消息 对蚂蚁集团及旗下机构处以罚款 含没收违法所得 71 23 亿元 并要求蚂蚁集团关停违规开展的 相互宝 业务 并依法补偿消费者利益 极客公园 7 月 7 日消息 据央行公布的行政处罚信息显示 今日 财付通支付科技有限公司
  • CoordinatorLayout的简单使用,android开发app的详细过程

    效果展示 代码展示
  • 军工重组

    http bar stockstar com p8448439 1 html 下周可千万别洗出来 2660到现在用了没多久就临近3000点 只要地产一起来马上就到3600了 地产现在不涨并不是不想涨 而是只要地产一起来马上就到3600 多数
  • VSCode安装教程最新,包教包会!

    一 VScode下载 1 进入VScode官网 官网地址 https code visualstudio com 点击 Download 进入下载 不要点击 Download for Windows Stable Build 否则它会自动帮
  • 编译Linux内核生成Image和System.map文件

    p span style font family 华文楷体 font size 12pt background color rgb 255 255 255 一直想琢磨琢磨Linux内核 便开始看 Linux内核完全注释 可是发现一头雾水 所