• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            糯米

            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 糯米 閱讀(1789) 評論(1)  編輯 收藏 引用 所屬分類: Misc

            評論

            # re: [bash源碼分析] 2 尋找入口點  回復  更多評論   

            樓主最后那一段話太幽默了!
            2010-11-01 00:54 | Serval
            久久综合久久性久99毛片| 久久精品国产亚洲AV大全| 久久综合久久综合久久综合| 亚洲色欲久久久综合网| 久久综合亚洲色HEZYO社区 | 97久久精品国产精品青草| 国产精品九九九久久九九 | 久久精品国产精品亜洲毛片| 久久久精品免费国产四虎| 91精品国产高清久久久久久91 | 久久国产综合精品五月天| 久久这里只精品99re66| 精品国产乱码久久久久久郑州公司| 精品国产91久久久久久久| 伊人久久大香线蕉AV一区二区| 久久精品黄AA片一区二区三区| 久久精品国产一区二区电影| 久久久久无码精品国产| 久久久久亚洲av成人无码电影| 91精品国产91久久久久福利| 久久99国产精品成人欧美| 国产精品久久久久…| 久久久一本精品99久久精品88| 成人a毛片久久免费播放| 久久Av无码精品人妻系列| 亚洲精品美女久久久久99小说 | 久久久久久精品成人免费图片 | 国产一久久香蕉国产线看观看| 欧美久久天天综合香蕉伊| 国内精品伊人久久久久网站| 东京热TOKYO综合久久精品 | 久久久久亚洲AV成人网人人网站| 91精品国产91久久久久久蜜臀| 狠狠色丁香婷综合久久| 久久91综合国产91久久精品| 97久久精品午夜一区二区| 色婷婷综合久久久中文字幕| 亚洲综合伊人久久综合| 久久久久久精品久久久久| 亚洲中文字幕久久精品无码APP | 久久天天躁狠狠躁夜夜躁2O2O|