これはトリッキーです。この方法でできると思います...ちなみに、libmagicソースをダウンロードして見ました...
magic_read_entries
内で呼び出される関数があります (これは、外部ファイルから読み取っているsourceforgeminifile.c
からダウンロードした純粋なバニラ ソースです。
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にコピーします。
- 同封の diff 出力を使用して違いを強調表示し、それをmagic.cソースに適用します。
48a49,51
> #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)){
> if (ftell(fp) != MAGIC_DATA_OFFSET) リターン 0;
>}その他{
> 0 を返します。
> }
>
- その後、makeを発行します
- マジック ファイル (Slackware Linux 12.2 で /etc からコピーしたもの) は、libmagic.a ファイル、つまり
cat magic >> libmagic.a
. 魔法の SHA チェックサムは (4abf536f2ada050ce945fbba796564342d6c9a61 魔法) です。システム。
- これはminifile.cソースの差分です。これを適用し、 make を再度実行してミニファイル実行可能ファイルを再構築します。
40c40
< magic_read_entries(mh,"マジック");
---
> /*magic_read_entries(mh,"magic");*/
それでうまくいくはずです。そうでない場合は、MAGIC_DATA_OFFSET を変更して、読み取り用にライブラリへのオフセットを調整する必要があります。ご希望であれば、魔法のデータ ファイルをペーストビンに貼り付けます。お知らせ下さい。
これがお役に立てば幸いです。よろしくお願いします、トム。