外部依存関係がなく、constデータセクションのみのCファイルがあるとしましょう。私はこのファイルをコンパイルして、関数ポインタを使って関数を使用する別のプログラムでロードできるバイナリBLOBを取得します。バイナリコードのオブジェクトファイル
のは例を見てみましょう、ここで私はそれが、その後f1.bin、f1.oし、コンパイル、およびprog内でこの ようにそれを使用したい
static const unsigned char mylut[256] = {
[0 ... 127] = 0,
[128 ... 255] = 1,
};
void f1(unsigned char * src, unsigned char * dst, int len)
{
while(len) {
*dst++ = mylut[*src++];
len--;
}
}
fictionnalバイナリモジュール、f1.cです.c
int somefunc() {
unsigned char * codedata;
f1_type_ptr f1_ptr;
/* open f1.bin, and read it into codedata */
/* set function pointer to beginning of loaded data */
f1_ptr =(f1_type_ptr)codedata;
/* call !*/
f1_ptr(src, dst, len);
}
私はf1.cからf1.oに行くと、位置の独立性を得るために-fPICが必要になると思います。 f1oからf1.binに行くのに、 を使用できるフラグまたはリンカースクリプトは何ですか?
説明:
私はダイナミックリンクについて知っています。動的リンクはこの場合不可能です。リンクステップは、可能であれば、ロードされたデータにキャストfuncポインタである必要があります。
OSがサポートされていないものとします。もし可能であれば、私は例えば のf1をPC関連のアドレスでアセンブリに書きます。
は、あなたが共有オブジェクト・ファイルを使用することができることを知っていますか? .cファイルを.soにコンパイルした後、 'dlopen()'をプログラムにロードし、関数ポインタ 'dlsym()'を関数に渡します。その後、それを呼び出すことができます。 –
libcとダイナミックリンクを忘れましょう – shodanex
'f1.bin'は動的に(つまり実行時に)ロードされますか?次に、共有ライブラリを構築し、ldopen()+ ldsym()または他のモジュールローダー(gmoduleなど)を使用する必要があります。何か他の方法でやろうとすると、潜在的なセキュリティの脅威(データセグメントの実行など)のために難しくなり、拒否される可能性があります。 –