Universal eXecutable Format

これは何?

sh8

フォーマット内容

01 (アライン情報) (.textのサイズ) (.dataのサイズ) (.bssのサイズ) [.textの生データ] [.textのリロケーション情報] [.dataの生データ] [.dataのリロケーション情報]

ローダプログラム例

void *load_uxf(const unsigned char *p)
{
     if (get_sh8(&p) != 0x01) return NULL; // フォーマット不一致.
     int i, j, k, l, u, m, siz[3], algn = get_sh8(&p);
     unsigned char *sct[3];
     for (i = 0; i < 3; i++) {
         siz[i] = get_sh8(&p);
         sct[i] = NULL;
         if (siz[i] > 0)
             sct[i] = malloc_aligned(siz[i], (algn >> (i * 4)) & 0xf);
     }
     for (i = 0; i < 2; i++) {
         if (siz[i] == 0) continue;
         for (j = 0; j < siz[i]; j++)
             sct[i][j] = *p++; // 生データのロード.
         j = get_sh8(&p);
         if (j == 0) continue;
         u = get_sh8(&p);
         l = 0;
         while (j > 0) {
             m = get_sh8(&p);
             l += (m >> 2) * u;
             int *q = (int *) (sct[i] + l);
             *q += (int) sct[m & 3];
             l += 4;
             j--;
         }
     }
     for (j = 0; j < siz[2]; j++)
         sct[2][j] = 0; // bss領域のクリア.
     // sct[0]の領域に、実行権限を付与する.
     return sct[0];
}

int get_sh8(const unsigned char **pp)
{
    const unsigned char *p = *pp;
    unsigned char c = *p++, b;
    int i, j;
    i = c;
    for (b = 0x80; (i & b) != 0; b >>= 1)
        i ^= b;
    for (b = 0x80; (c & b) != 0; b >>= 1)
        i = i << 8 | *p++;
    *pp = p;
    return i;
}

void *malloc_aligned(int siz, int algn)
{
    if (algn == 0) algn = 4;
    algn = 1 << algn;
    // このsizとalgnでメモリ領域を確保 → p
    // まあ簡易的には以下の方法で実現できる(freeのことは考えてない).
    int p = (int) malloc(siz + algn);
    if ((p & (algn - 1)) != 0)
        p = (p + (algn - 1)) & ~(algn - 1);
    return (void *) p;
}

uxfのプログラムはどうやって書くの?

こめんと欄


コメントお名前NameLink

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS