LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 56910|回复: 42

如何学习编译内核──索引篇

[复制链接]
发表于 2005-8-9 13:28:29 | 显示全部楼层 |阅读模式
第一帖

内核管理概述


第二帖:

2.4->2.6内核升级指南


第三帖:

学习编译内核── 为新手指南

第三帖:

FC2重新编辑内核心得

正在更新之中。。。。
发表于 2005-8-10 01:44:04 | 显示全部楼层
编译内核很痛苦啊!

我用的是RedHat9.0, 根据第一贴 "2.4->2.6内核升级指南", 首先需要把必要的软件包都升级到要求的版本以上, 经过折腾, 有的是直接用rpm -Uvh 或 rpm -ivh, 有的是直接用源代码编译, 总算把大部分软件包都升级了. 有一个软件包oprofile死活装不上, 用rpm装的时候出来这样的错误:
error: Failed dependencies:
        libc.so.6(GLIBC_2.3.4) is needed by oprofile-0.8-0.20040121.3
可是我的/lib目录里明明有
lrwxrwxrwx    1 root     root           13  8月  2 10:45 libc.so.6 -> libc-2.3.2.so
(我已经经历过N次这样的错误了, 这是我非常痛恨rpm的主要原因.)
改用源代码编译的时候, make的时候出来这样的错误:
The present kernel configuration has modules disabled.
Type 'make config' and enable loadable module support.
Then build a kernel with module support enabled.

TNND, RedHat9缺省的内核编译居然是modules disabled!!!我折腾来折腾去就是想把2.4.20-8的内核升级到2.6.12.4去, 到头来还得让我先编译原来2.4.20-8的内核? 先把这事放一放, oprofile说不定不是很有用的模块.

接下来顺利地把module-init-tools升上去了. 然而在升级mkinitrd的时候又碰到了致命的问题.
根据说明, 要想升级mkinitrd, 首先要升级lvm2和device-mapper, 用rpm -Uvh升级lvm2的时候出来一大堆的错误:
error: Failed dependencies:
        libdevmapper.so.1.00 is needed by lvm2-2.00.15-2
        libdevmapper.so.1.00(Base) is needed by lvm2-2.00.15-2
        libselinux.so.1 is needed by lvm2-2.00.15-2
        lvm < 1.0.3-19 conflicts with lvm2-2.00.15-2
看来要先装device-mapper再装lvm2, 另外lvm与lvm2冲突, 要先卸载lvm.
那就卸载lvm吧, NND, lvm is needed by (installed) mkinitrd-3.4.42-1
顾不得了, 用rpm -e -nodeps卸载. 不过现在还是先把device-mapper装好, 再收拾lvm2.

会过头来, 用rpm升级device-mapper, 结果出来
error: Failed dependencies:
        libselinux.so.1 is needed by device-mapper-1.00.14-3
查了一下, 机器上却是没有libselinux.so.1, 在网上荡了一个rpm软件包, 结果又是这样一个错误,
error: Failed dependencies:
        libc.so.6(GLIBC_2.3.4) is needed by libselinux-1.11.4-1

我不知道我机器里的libc.so.6发了什么猪瘟, 看来是因为我机器里的libc.so.6-->libc-2.3.2.so不是GLIBC_2.3.4.

只好再到网上去荡了一个glibc的软件包, 用rpm -Uvh升级的时候, 好了, 出来一大堆冲突

        package glibc-32bit-9-200508050455 is intended for a x86_64 architecture        file /lib/i686/libc.so.6 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
        file /lib/i686/libm.so.6 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
        file /lib/i686/libpthread.so.0 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
        file /lib/ld-linux.so.2 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
        file /lib/libBrokenLocale.so.1 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
   .....

我更本就没有卸载glibc-2.3.2-11.9的勇气, 因为我知道, 无数的东西都需要这个glibc-2.3.2-11.9.
事已如此, 我只好暂时放弃了.

大虾们, 能不能指教一下, 该怎么升级glibc????
回复 支持 反对

使用道具 举报

发表于 2005-8-10 02:58:07 | 显示全部楼层
我找了半天也没有找到合适的glibc-2.3.4的版本. 就算是找到了, 安装上的难度好象不比编译新内核小啊.
回复 支持 反对

使用道具 举报

【人生如梦】 该用户已被删除
发表于 2005-8-10 03:50:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2005-8-10 05:01:35 | 显示全部楼层
直接用rpm来升级glibc看来是没有指望了. 我在

http://ftp.gnu.org/gnu/glibc/

荡下了两个文件
glibc-2.3.4.tar.bz2
glibc-linuxthreads-2.3.4.tar.bz2

安装后会不会因为没有直接从glibc-2.3.2升级而出问题?
回复 支持 反对

使用道具 举报

发表于 2005-8-10 15:06:13 | 显示全部楼层
辛辛苦苦编译了半天, 结果出来这样两个错误, 怎么办?

collect2: ld returned 1 exit status
make[2]: *** [/usr/src/glibc-build/linuxthreads/libpthread.so] Error 1
make[2]: Leaving directory `/usr/src/glibc-2.3.4/linuxthreads'
make[1]: *** [linuxthreads/others] Error 2
make[1]: Leaving directory `/usr/src/glibc-2.3.4'
make: *** [all] Error 2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-10 20:21:04 | 显示全部楼层
编译glib的新包,是不是也要升级一下linuxthreads  ?看看他的README和INSTALL吧。
回复 支持 反对

使用道具 举报

发表于 2005-8-11 02:56:29 | 显示全部楼层
唉, 是编译过程出的错, 跟linuxthreads升级没有关系. 实际上linuxthreads是跟glibc一起编译的.
具体错误如下:

): In function `pthread_initialize':
/home/pack/src/glibc-2.3.4/linuxthreads/pthread.c:549: undefined reference to `_res'
/home/pack/src/glibc-build/linuxthreads/libpthread_pic.a(pthread.os)(.text+0xd16): In function `__pthread_reset_main_thread':
/home/pack/src/glibc-2.3.4/linuxthreads/pthread.c:1145: undefined reference to `_errno'
/home/pack/src/glibc-build/linuxthreads/libpthread_pic.a(pthread.os)(.text+0xd22):/home/pack/src/glibc-2.3.4/linuxthreads/pthread.c:1146: undefined reference to `_h_errno'
/home/pack/src/glibc-build/linuxthreads/libpthread_pic.a(pthread.os)(.text+0xd34):/home/pack/src/glibc-2.3.4/linuxthreads/pthread.c:1147: undefined reference to `_res'
/home/pack/src/glibc-build/linuxthreads/libpthread_pic.a(pthread.os)(.data.rel+0x1b8): In function `pthread_initialize':
/home/pack/src/glibc-2.3.4/linuxthreads/pthread.c:549: undefined reference to `_errno'
/home/pack/src/glibc-build/linuxthreads/libpthread_pic.a(pthread.os)(.data.rel+0x1c0):/home/pack/src/glibc-2.3.4/linuxthreads/pthread.c:549: undefined reference to `_h_errno'
/home/pack/src/glibc-build/linuxthreads/libpthread_pic.a(pthread.os)(.data.rel+0x1c8):/home/pack/src/glibc-2.3.4/linuxthreads/pthread.c:553: undefined reference to `_res'
collect2: ld returned 1 exit status
make[2]: *** [/home/pack/src/glibc-build/linuxthreads/libpthread.so] Error 1
make[2]: Leaving directory `/home/pack/src/glibc-2.3.4/linuxthreads'
make[1]: *** [linuxthreads/others] Error 2
make[1]: Leaving directory `/home/pack/src/glibc-2.3.4'
make: *** [all] Error 2

具体就是在pthreads.c中,

#ifdef USE_TLS
  /* Update the descriptor for the initial thread. */
  THREAD_SETMEM (((pthread_descr) NULL), p_pid, __getpid());
# ifndef HAVE___THREAD
  /* Likewise for the resolver state _res.  */
  THREAD_SETMEM (((pthread_descr) NULL), p_resp, &_res);
# endif
#else
  /* Update the descriptor for the initial thread. */
  __pthread_initial_thread.p_pid = __getpid();
  /* Likewise for the resolver state _res.  */
  __pthread_initial_thread.p_resp = &_res;       //<--------------line 549
#endif



#if !(USE_TLS && HAVE___THREAD)
  /* Now this thread modifies the global variables.  */
  THREAD_SETMEM(self, p_errnop, &_errno);             //<----------- line 1145
  THREAD_SETMEM(self, p_h_errnop, &_h_errno);    //<----------- line 1146
  THREAD_SETMEM(self, p_resp, &_res);                   //<----------- line 1147
#endif

我最害怕这种编译环境变量设置不当引起的找不到变量的错误. 也不知道那个USE_TLS是什么东东. 看来glibc近期内是编不成了.
回复 支持 反对

使用道具 举报

发表于 2005-8-11 04:17:01 | 显示全部楼层
Sorry. 问题解决了!
在configure的时候, 要多加一个选项: --without-tls

tls是 thread-local storage的意思, 偶根本就不知道究竟是干哈的.
回复 支持 反对

使用道具 举报

发表于 2005-9-9 19:47:09 | 显示全部楼层
TLS? 这个我在win下用过,基本上属于每个线程维持自己的一份本地数据,重入线程回调函数的其它线程只能保存和获取自身的一份数据,从而避免冲突,一般是用来解决旧版的AnsiC里面一些不能重入的函数在多线程调用时的问题,如strtok等。
    换句话说,不用TLS在C里面多线程调用strtok就应该死翘翘了,不知道我说得对不对。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表