这很棘手,我想你可以这样做......顺便说一句,我已经下载了 libmagic 源代码并查看它......
里面有一个函数叫magic_read_entries
内minifile.c
(这是我从下载的纯香草源来源锻造 http://sourceforge.net/projects/libmagic它正在从外部文件读取。
您可以附加magic
文件(位于 /etc 目录中)添加到库代码的末尾,如下所示cat magic >> libmagic.a
。在我的系统中,magic
是 474443 字节,libmagic.a
是 38588 字节。
In the magic.c
文件,您需要更改magichandle_t* magic_init(unsigned flags)
函数,在函数末尾添加一行magic_read_entries
并修改函数本身以在库本身的偏移量处读取以提取数据,将其视为指向 char (char **) 的指针,并使用它而不是从文件中读取。既然您知道要读取的库数据的偏移量,那么这应该不难。
现在功能magic_read_entries
将不再使用,因为不再从文件中读取它。函数“magichandle_t* magic_init(unsigned flags)”将负责加载条目,你应该没问题。
如果您需要进一步的帮助,请告诉我,
Edit:我使用了来自 sourceforge.net 的旧“libmagic”,这就是我所做的:
- 将下载的存档提取到我的主目录中,解压缩/解压存档将创建一个名为的文件夹libmagic.
- 在 libmagic 中创建一个文件夹并调用它Test
- 复印原件magic.c and 迷你文件.c into Test
- 使用随附的 diff 输出突出显示差异,将其应用到magic.c source.
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;
> }
>
- 然后发出make
- magic 文件(我在 Slackware Linux 12.2 下从 /etc 复制)连接到 libmagic.a 文件,即
cat magic >> libmagic.a
。 magic 的 SHA 校验和为 (4abf536f2ada050ce945fbba796564342d6c9a61 magic),
这是魔法的确切数据
(-rw-r--r-- 1 root root 474443 2007-06-03 00:52 /etc/file/magic) 在我的系统上找到。
- 这是差异迷你文件.c源,应用它并通过运行重建迷你文件可执行文件make again.
40c40
< magic_read_entries(mh,"magic");
---
> /*magic_read_entries(mh,"magic");*/
那么它应该可以工作。如果没有,您将需要通过修改 MAGIC_DATA_OFFSET 来调整库中的偏移量以供读取。如果你愿意,我可以将魔法数据文件粘贴到pastebin中。让我知道。
希望这可以帮助,
此致,
汤姆.