糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

[bash源码分析] 2 寻找入口点

2. 寻找入口点

--- 获得源码

    直接在主页就可以下载到了,用ubuntu的可以很方便的get到:
    apt-get source bash
    我的ubuntu是9.04,get到的是bash-3.2。没有打debian的补丁。

--- Makefile

    bash的Makefile是由autoconf工具根据Makefile.in和configure.in来生成的。
    Makefile中只有小部分的配置是可更改的,一般来说这小部分都是不重要的部分。
    所以./configure后生成出来的Makefile与Makefile.in相比差别不大。我们把Makefile.in视为Makefile。

--- 主要依赖关系

    打开Makefile.in。从all开始跟下去。

    all -> .made -> $(Program)

    Program = bash$(EXEEXT)
    $(Program): .build $(OBJECTS) $(BUILTINS_DEP) $(LIBDEP)

    LIBDEP = $(SHLIB_DEP) $(INTL_DEP) $(READLINE_DEP) $(HISTORY_DEP) $(TERMCAP_DEP) $(GLOB_DEP) \
         $(TILDE_DEP) $(MALLOC_DEP)

    BUILTINS_DEP = $(BUILTINS_LIBRARY)
    BUILTINS_LIBRARY = $(DEFDIR)/libbuiltins.a

    # Matching object files.
    OBJECTS     = shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o $(GLOBO) \
           dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o \
           expr.o flags.o $(JOBS_O) subst.o hashcmd.o hashlib.o mailcheck.o \
           trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o \
           alias.o array.o arrayfunc.o braces.o bracecomp.o bashhist.o \
           bashline.o $(SIGLIST_O) list.o stringlib.o locale.o findcmd.o redir.o \
           pcomplete.o pcomplib.o syntax.o xmalloc.o $(SIGNAMES_O)

    简要的看了一下,LIBDEP和BUILTINS_DEP是一些静态库,单独实现一些功能的模块。我们可以先不看。
    而OBJECTS看起来就是bash的核心部分了。
    其中形似$(xxx_O)的变量是在./configure中指定的,不用理会。

--- 关键文件列表

    整理了一下

   1795 shell.c
    275 eval.c
   6277 y.tab.c
   1029 general.c
    856 make_cmd.c
   1307 print_cmd.c
    329 dispose_cmd.c
   4143 execute_cmd.c
   4270 variables.c
    422 copy_cmd.c
    452 error.c
   1348 expr.c
    355 flags.c
   8140 subst.c
    196 hashcmd.c
    442 hashlib.c
    438 mailcheck.c
    983 trap.c
    627 input.c
    318 unwind_prot.c
    438 pathexp.c
    595 sig.c
    825 test.c
     83 version.c
    574 alias.c
    932 array.c
    837 arrayfunc.c
    630 braces.c
    200 bracecomp.c
    823 bashhist.c
   3199 bashline.c
    137 list.c
    284 stringlib.c
    509 locale.c
    598 findcmd.c
   1086 redir.c
   1394 pcomplete.c
    225 pcomplib.c
    193 xmalloc.c
  47564 总用量

    可见bash并不是个省油的灯,区区30多个核心文件就4w多行代码。比linux0.11还大。
    其中的subst.c更是巅峰造极,8000行。

    统计一下bash工程的总代码量:
    find -name '*.[ch]' | xargs cat | wc -l
    结果是13w+行。。真挺多的


--- 入口点

    这么多文件,没有理由一个个去找main函数。首先在源码根目录下执行ctags -R *。
    ctags看源码的时候也会用到的。然后 vi -t main。就可以列出所有main函数的定义。
    这时候我们发现有几十个main函数,就像剑圣的分身一样,真假难辩。
    从程序员的直觉可以得出shell.c里面的main函数是真身。
    其他的main函数都是测试用的。
    形如:
    #ifdef xxx_TEST
    main() { ... }
    #endif
      
    下一篇我们就从 shell.c 里的 main 开始分析。


--- bash 的生日

    shell.c 文件开头的那一段注释尾部:
    ...
    Birthdate:
    Sunday, January 10th, 1988.
    Initial author: Brian Fox
    */
   
    bash 居然已经诞生了20多年了,比我还大9个月。这么说来,也是个80后呢。
    呵呵,bash 都算是个富二代了:
    贵族出身(GNU),身边不乏追求者(贡献者),还搭上了一个90后mm(linux)。


posted on 2010-07-25 10:18 糯米 阅读(1760) 评论(1)  编辑 收藏 引用 所属分类: Misc

评论

# re: [bash源码分析] 2 寻找入口点  回复  更多评论   

楼主最后那一段话太幽默了!
2010-11-01 00:54 | Serval

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理