2010-01-23 260 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编写一个安装程序。