Ubuntu下編譯pdfium

源代碼下載

  1. 前提條件是打開ss,不然毛都下載不下來
  2. google重新發明了一套下載、編譯、測試自家項目的工具(輪子)depot_tool(包括gcllient、GYP、GN和Ninja等),所有的代碼都需要利用這些工具從命令行下載編譯。于是我們需要讓終端也具備ss的能力。
    • 下載polipo,終端執行sudo polipo socksParentProxy=localhost:1080
    • 終端執行export https_proxy=127.0.0.1:8123,搞定。嫌每次打開終端都要輸入這句很麻煩的話,可以把它加到bashrc里面。
  3. 下載depot_tools。或者打開ss的全局模式,去googlesource.com網站上下載,或者終端執行
        git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    
  4. 將depot_tools目錄添加到系統$PATH,執行
        gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git
    

加入要同步的項目目錄

  1. 執行gclient sync進行同步,獲得pdfium的源代碼。同步時間會很長,因為同步下來的目錄大小大概是3.5G
  2. 期間會提示“To use a proxy in this situation, please supply those settings in a .boto file pointed to by the NO_AUTH_BOTO_CONFIG environment var.” 可能需要配置一下polipo,不過我依然下載了全部代碼,編譯通過了。

編譯

沒有找到項目首頁里說的編譯文件build/gyp_pdfium,因為據說google已經放棄GYP,只支持GN構建了。GN的用法參考這里。按照代碼目錄下的README.md的步驟編譯就好啦。我關掉了v8和xfa支持,編譯起來還挺快。幾個注意事項如下:

  1. pdfium默認靜態編譯,不放心的話在args.gn文件里加上一句pdf_is_complete_lib = true。這個條件定義在根目錄下的BUILD.gn里,它的關鍵在于設置了GN工具的參數complete_static_lib為真。
  2. 如果想修改args.gn或者某個BUILD.gn里定義的參數重新編譯,執行下列命令即可:
        ninja -C <out_dir> -t clean  # 清除已生成文件
        gn gen <out_dir>             # 重新生成編譯文件
        ninja -C <out_dir>           # 編譯
    
  3. 編譯過程中如果出現cc1plus: all warnings being treated as errors的錯誤,去/build/config/compiler/BUILD.gn文件里把treat_warnings_as_errors改成false

用AFL對pdfium做模糊測試

AFL需要對測試對象插樁,所以得用afl-gccafl-clang來編譯測試對象。雖然對google新發明的這套編譯流程一竅不通,不過我還是找到兩種辦法。

方法1:利用chromium中的現成代碼

不知道為什么,chromium代碼是直接支持afl測試的,但是作為它的pdf解析器的pdfium卻去掉了相應的代碼,然后又在BUILD.gn中保留了這個選項。幸好我見過不少精分,還比較淡定。

  1. 首先下載chromium的afl支持文件,放到third_party/afl目錄下。其實管用的就那一個BUILD.gn,src目錄下就是afl的源代碼,我直接用的我本機上的。
  2. 在args.gn文件里里加上use_afl = trueoptimize_for_fuzzing = true的開關,重新編譯。
  3. 編譯完成后在你的<out_dir>目錄下會有afl-fuzz文件,以及業已插樁完畢pdfium_test。下面用afl的默認方式測試pdfium_test即可。不過測試速度很慢,exec_speed只有200/sec左右。

PS:從pdfium的BUILD.gn代碼里可以知道,它還支持libfuzzer和drfuzz的測試,開關為use_drfuzzuse_libfuzzer。不過默認也是沒有對應支持文件的,需要自己加,我就沒研究了。

方法2. 在toolchain中指定自己編譯的afl-gcc

GN工具用toolchains來制定構建項目用到的編譯器、鏈接器以及相應參數等。通常GN的主配置文件會根據主機和目標的架構設置default_toolchain,比如pdfium就在build/config/BUILDCONFIG.gn里對這樣設置Linux x86_64下的缺省toolchain。

    if (is_clang) {
         _default_toolchain = "http://build/toolchain/linux:clang_$target_cpu"
    } else {
         _default_toolchain = "http://build/toolchain/linux:$target_cpu"
    }

其中is_clang可以在args.gn里聲明,缺省似乎是is_clang = true。想用哪個編譯器插樁,就去代碼中引號指明的對應文件里把cc = "xxx"改成 cc = "afl-xxx",并對應地將is_clang設為truefalse

不知道得到的pdfium用的什么編譯器編譯出來的?執行

   objdump -s --section .comment out/Debug/pdfium_test

看看注釋里有無clang或gcc字樣就可以了。

其他pdf引擎的編譯

常見的C/C++編寫的pdf引擎有poppler(Evince、Xpdf、Libreoffice)、podofo(ImageMagick)和mupdf(SumatraPDF,Zathura)

編譯Podofo

采用了CMake編譯系統,使用模糊測試同樣需要指定CCCXX--disable-shared。所以編譯命令形如:

     CC=afl-gcc CXX=afl-g++ cmake -G "Unix Makefiles" ../podofo-0.9.5/ -DPODOF O_BUILD_SHARED:BOOL=FALSE -DPODOFO_BUILD_STATIC:BOOL=TRUE

如果提示找不到FREETYPE_LIBRARYFONTCONFIG_LIBRARY,安裝libfreetype6-dev,libfontconfig1-dev包就行了。剩下的找不到libjpeg、libtiff之類不影響程序編譯。

編譯poppler

同樣采用了CMake,編譯命令形如:

     CC=afl-gcc CXX=afl-g++ cmake ../poppler-0.64.0/ -DBUILD_SHARED_LIBS=OFF
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容