这很棘手,我想你可以这样做...顺便说一句,我已经下载了 libmagic 源并查看了它...
在minifile.c 中有一个名为magic_read_entries 的函数(这是我从sourceforge 下载的纯香草源代码,它正在从外部文件读取。
您可以将magic 文件(位于/etc 目录中)附加到库代码的末尾,例如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(unsigned flags)' 将负责加载条目,你应该没问题。
如果您需要进一步的帮助,请告诉我,
编辑:
我使用了 sourceforge.net 中的旧的“libmagic”,这就是我所做的:
- 将下载的存档解压缩到我的主目录中,解压缩/解压缩存档将创建一个名为 libmagic 的文件夹。
- 在 libmagic 中创建一个文件夹并将其命名为 Test
- 将原magic.c和minifile.c复制到Test
- 使用封闭的差异输出突出显示差异,将其应用到 magic.c 源。
48a49,51
> #define MAGIC_DATA_OFFSET 0x971C
> #define MAGIC_STAT_LIB_NAME "libmagic.a"
>
125a129,130
> /* magic_read_entries 已过时... */
> magic_read_entries(mh, MAGIC_STAT_LIB_NAME);
251c256,262
> if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){
> 如果 (ftell(fp) != MAGIC_DATA_OFFSET) 返回 0;
> }其他{
> 返回 0;
> }
>
- 然后发出 make
- magic 文件(我在 Slackware Linux 12.2 下从 /etc 复制)连接到 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 源的差异,应用它并通过再次运行 make 来重建 minifile 可执行文件。
40c40
/*magic_read_entries(mh,"magic");*/
那么它应该可以工作。如果没有,您将需要通过修改 MAGIC_DATA_OFFSET 来调整库中的偏移量以供读取。如果您愿意,我可以将魔术数据文件粘贴到 pastebin 中。告诉我。
希望这会有所帮助,
最好的祝福,
汤姆。