2010-01-23 36 views
3

感謝幫助我使用我的previous question的人(僅供參考)。靜態編譯libmagic(c/C++文件類型檢測)

我可以將文件fileTypeTest.cpp,libmagic.amagic放在一個目錄中,我可以用g++ -lmagic fileTypeTest.cpp fileTypeTest進行編譯。稍後,我將測試它是否在使用MinGW編譯的Windows中運行。

我打算在一個小的GUI應用程序中使用libmagic,我想靜態編譯它進行分發。我的問題是,libmagic似乎需要外部文件,magic。 (我實際上使用我自己的縮短和編譯的版本,magic_short.mgc,但我離題了)。

一個拙劣的解決方案是將文件編碼到應用程序中,根據需要創建(和刪除)外部文件。我怎樣才能避免這種情況?

增加了淨度:

magic是描述不同文件類型的屬性的文本文件。當被要求識別文件時,libmagic通過magic搜索。有一個編譯版本,magic.mgc工作得更快。我的應用程序只需要確定一些文件類型,然後再決定如何處理它們,所以我將使用我自己的magic_short文件創建magic_short.mgc

回答

5

這是棘手的,我想你可以做這樣......順便說一下,我已經下載了libmagic源,並看着它......

那裏面有一個功能在minifile.c中調用magic_read_entries(這是我從sourceforge下載,它從外部文件中讀取純香草源。

你可以追加magic文件(這是在/ etc目錄中找到),以結束圖書館的代碼,就像這樣s cat magic >> libmagic.a。在我的系統中,magic是474443字節,libmagic.a是38588字節。

magic.c文件,你就需要改變magichandle_t* magic_init(unsigned flags)功能,在函數的末尾添加行magic_read_entries和修改功能本身在圖書館本身的數據拉的偏移讀取,對待它作爲指向char的指針(char **)並使用它而不是從文件中讀取。既然你知道圖書館數據的偏移量在哪裏讀取,那應該不難。

現在函數magic_read_entries將不再使用,因爲它不會再從文件中讀取。函數`magichandle_t * magic_init(無符號標誌)'將負責加載條目,你應該在那裏確定。

如果您需要進一步的幫助,讓我知道,

編輯: 我從sourceforge.net使用舊的「libmagic」這裏是我做過什麼:

  1. 提取下載的檔案到我的主目錄中,unzip/untarring檔案將創建一個名爲的文件夾libmagic
  2. 創建libmagic內的文件夾,並把它測試
  3. 複製原magic.cminifile.c測試
  4. 使用封閉diff的輸出凸顯差異,其應用到magic.c來源。
 
48a49,51 
> #define MAGIC_DATA_OFFSET  0x971C 
> #define MAGIC_STAT_LIB_NAME "libmagic.a" 
> 
125a129,130 
>  /* magic_read_entries is obsolete... */ 
>  magic_read_entries(mh, MAGIC_STAT_LIB_NAME); 
251c256,262 
< 
--- 
> 
>  if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){ 
>    if (ftell(fp) != MAGIC_DATA_OFFSET) return 0; 
>  }else{ 
>    return 0; 
>  } 
> 
  • 然後發出使
  • 魔術文件(我從/ etc複製,下Linux嵌入12.2)被級聯到libmagic.a文件,即cat magic >> libmagic.a。 SHA的校驗和爲魔法(4abf536f2ada050ce945fbba796564342d6c9a61魔術), 這裏是魔術的確切數據 (-rw-r - r - 1 root root 474443 2007-06-03 00:52/etc/file/magic)在我的系統上。
  • 這裏是爲minifile.c源的差異,通過運行使再次提出申請,並重建minifile可執行文件。
 
40c40 
<  magic_read_entries(mh,"magic"); 
--- 
>  /*magic_read_entries(mh,"magic");*/ 

它應該工作即可。如果不是,則需要通過修改MAGIC_DATA_OFFSET來調整庫中的偏移量以便讀取。如果你願意,我可以將魔術數據文件粘貼到pastebin中。讓我知道。

希望這會有所幫助, 最好的問候, 湯姆。

+0

我還想過使用/修改libmagic的源代碼,所以我也發現了sourceforge版本,但是我懷疑它們與ubuntu repo中的libmagic-dev不一樣。如果您使用'man libmagic'或檢查http://linux.die.net/include/magic.h,則時間戳是2003.SF中的一個是2000(http://sourceforge.net/projects/libmagic/files /)。否則,我想這將是一個很好的解決方案,我可以開始研究如何實現它。 – Kache 2010-01-23 23:36:23

+0

它看起來不像來自更新的libmagic 5.03的'magic'條目與舊的libmagic alpha兼容。看起來像libmagic 5.03包含在5.03文件中(來自'man file',ftp.astron.com/pub/file/file-5.04.tar.gz),所以我會試着去解決這個問題。我想我可能會陷入困境試圖做附加&指針抵消的事情,如果我到了那一點。 – Kache 2010-01-24 02:19:44

+0

無論哪種方式,如果您需要我的幫助,請不要猶豫,通過回覆問! ;) – t0mm13b 2010-01-24 02:29:30

1

我可以告訴你如何靜態編譯一個庫 - 只需將路徑傳遞給g ++命令末尾的.a文件.a文件只是編譯對象(.o)的歸檔文件。使用「ldd fileTypeTest」會顯示動態鏈接庫 - $ {libdir} /libmagic.so不應該在其中。

至於在外部數據文件中的鏈接......我不知道 - 你能否打包應用程序(.deb | .rpm | .tar.bz2)?在Windows上,我會使用NSIS編寫一個安裝程序。