• <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, 評(píng)論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            [bash源碼分析] 2 尋找入口點(diǎn)

            2. 尋找入口點(diǎn)

            --- 獲得源碼

                直接在主頁就可以下載到了,用ubuntu的可以很方便的get到:
                apt-get source bash
                我的ubuntu是9.04,get到的是bash-3.2。沒有打debian的補(bǔ)丁。

            --- Makefile

                bash的Makefile是由autoconf工具根據(jù)Makefile.in和configure.in來生成的。
                Makefile中只有小部分的配置是可更改的,一般來說這小部分都是不重要的部分。
                所以./configure后生成出來的Makefile與Makefile.in相比差別不大。我們把Makefile.in視為Makefile。

            --- 主要依賴關(guān)系

                打開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是一些靜態(tài)庫,單獨(dú)實(shí)現(xiàn)一些功能的模塊。我們可以先不看。
                而OBJECTS看起來就是bash的核心部分了。
                其中形似$(xxx_O)的變量是在./configure中指定的,不用理會(huì)。

            --- 關(guān)鍵文件列表

                整理了一下

               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并不是個(gè)省油的燈,區(qū)區(qū)30多個(gè)核心文件就4w多行代碼。比linux0.11還大。
                其中的subst.c更是巔峰造極,8000行。

                統(tǒng)計(jì)一下bash工程的總代碼量:
                find -name '*.[ch]' | xargs cat | wc -l
                結(jié)果是13w+行。。真挺多的


            --- 入口點(diǎn)

                這么多文件,沒有理由一個(gè)個(gè)去找main函數(shù)。首先在源碼根目錄下執(zhí)行ctags -R *。
                ctags看源碼的時(shí)候也會(huì)用到的。然后 vi -t main。就可以列出所有main函數(shù)的定義。
                這時(shí)候我們發(fā)現(xiàn)有幾十個(gè)main函數(shù),就像劍圣的分身一樣,真假難辯。
                從程序員的直覺可以得出shell.c里面的main函數(shù)是真身。
                其他的main函數(shù)都是測(cè)試用的。
                形如:
                #ifdef xxx_TEST
                main() { ... }
                #endif
                  
                下一篇我們就從 shell.c 里的 main 開始分析。


            --- bash 的生日

                shell.c 文件開頭的那一段注釋尾部:
                ...
                Birthdate:
                Sunday, January 10th, 1988.
                Initial author: Brian Fox
                */
               
                bash 居然已經(jīng)誕生了20多年了,比我還大9個(gè)月。這么說來,也是個(gè)80后呢。
                呵呵,bash 都算是個(gè)富二代了:
                貴族出身(GNU),身邊不乏追求者(貢獻(xiàn)者),還搭上了一個(gè)90后mm(linux)。


            posted on 2010-07-25 10:18 糯米 閱讀(1789) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Misc

            評(píng)論

            # re: [bash源碼分析] 2 尋找入口點(diǎn)  回復(fù)  更多評(píng)論   

            樓主最后那一段話太幽默了!
            2010-11-01 00:54 | Serval
            亚洲日本va中文字幕久久| 无码乱码观看精品久久| 久久精品中文无码资源站| 日本久久久久亚洲中字幕| 久久综合丝袜日本网| 色99久久久久高潮综合影院| 亚洲乱码中文字幕久久孕妇黑人| 久久影院综合精品| a级毛片无码兔费真人久久| 欧美激情精品久久久久久| 人妻无码αv中文字幕久久 | 久久久久亚洲精品无码网址| 天堂无码久久综合东京热| 无码精品久久久天天影视| 中文字幕久久欲求不满| 亚洲精品无码久久千人斩| 久久精品亚洲福利| 精品999久久久久久中文字幕| 久久久久综合中文字幕| 99久久精品国产免看国产一区| 久久久久97国产精华液好用吗| 久久久久国产精品熟女影院| 久久人人爽人人澡人人高潮AV| 97久久精品无码一区二区| 久久久无码精品亚洲日韩京东传媒| 国产精品欧美久久久天天影视| 三上悠亚久久精品| 久久狠狠爱亚洲综合影院| 一本久道久久综合狠狠躁AV| 国产成人99久久亚洲综合精品| 精品午夜久久福利大片| 久久精品国产亚洲AV电影| 欧美牲交A欧牲交aⅴ久久 | 国产三级精品久久| 一本大道久久a久久精品综合| 国产精品久久久久久福利漫画| 日产精品久久久久久久| 天天躁日日躁狠狠久久| 日韩精品久久久久久免费| 亚洲第一极品精品无码久久| 蜜臀av性久久久久蜜臀aⅴ|