外部依存関係がなく、const データ セクションのみの C ファイルがあるとします。このファイルをコンパイルして、別のプログラムにロードできるバイナリ BLOB を取得したいと思います。このプログラムでは、関数ポインタを介して関数が使用されます。
例を見てみましょう。これは架空のバイナリ モジュール f1.c です。
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--;
}
}
f1.o、次にf1.binにコンパイルし、prog.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 が必要だと思います。f1.o から f1.bin に移行するために使用できるフラグまたはリンカー スクリプトは何ですか?
明確化:
動的リンクについて知っています。この場合、動的リンクはできません。リンクステップは、可能であれば、ロードされたデータへの func ポインターをキャストする必要があります。
OS のサポートはないと仮定してください。可能であれば、たとえばアセンブリに f1 を PC 関連のアドレス指定で記述します。