いくつか

今日は私事都合にて自宅作業でした。これまでも数度経験があるんですが、ペースが掴めず異様に疲れます。今日もへろへろ状態ッス。沖縄にも coworking な場所が出来はじめているとの話も聞きますので、そうした場所で、という方が良いのかなぁ、と思ってます。
今日お世話になった所は価格設定などが以前と変わってて、人は少なくなってたんですが、長居するには厳しいカンジになってました。

vagrant-guard-demo

vagrant はまだ正常動作してません。vagrant up が異常終了。cucumber な試験 (というか rake) もパスしておりません。

[default] Failed to connect to VM!
Failed to connect to VM via SSH. Please verify the VM successfully booted
by looking at the VirtualBox GUI.

virtualbox-4.1 は 4.1.0 です。ssh で接続できないから試験にパスしていないのか。ちょっと寝かせてもう別途確認の方向。

COFF

なんとなくスタティックライブラリ関数の検出とフックを見つつ COFF なフォーマットのシンボル情報を出力するようなツールを書きました。
久々に C で書いたので何となく微妙なカンジではありますが、以下に貼ってみますので、コメント頂ければ幸いです。Linux な環境であれば普通に実行ファイルは作れるはずです。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#include <linux/coff.h>

static int getFilesize(char *fname) {
    FILE *fp;
    long sz;

    fp = fopen(fname, "rb");
    if(fp == NULL){
        printf("%s cannot open\n", fname);
        return -1;
    }

    fseek(fp, 0, SEEK_END);
    sz = ftell(fp);

    fclose(fp);

    return sz;	
}

static long nsyms, symoff;

static void symbol_output_main(struct COFF_filehdr *ptr) {
    int i, j;
    struct COFF_syment *symptr = (struct COFF_syment *)((char *)ptr + symoff);
    void *longsym = (void *)(symptr + nsyms);

    for(i = 0; i < nsyms; i++) {
        if(0 == COFF_LONG(symptr[i].e.e.e_zeroes)) {
            printf("logsym : %s\n", (char *)longsym + COFF_LONG(symptr[i].e.e.e_offset));
        } else {
            printf("e_name : ");
            for(j = 0; j < E_SYMNMLEN; j++) {
                if(0 == isgraph(symptr[i].e.e_name[j])) break;
                printf("%c", symptr[i].e.e_name[j]);
            }
            printf("\n");
        }

        if(0 != symptr[i].e_numaux[0]) {
            i += symptr[i].e_numaux[0];
        }
    }

    return;
}

static void printCOFFinfo(char *fname) {
    void *ptr;
    FILE *fp;
    int sz = getFilesize(fname);
    int readsz;
    short int magic;

    if(NULL == (ptr = malloc(sz))) {
        fprintf(stderr, "memory allocation error\n");
        exit(1);
    }

    if(NULL == (fp = fopen(fname, "rb"))) {
        fprintf(stderr, "%s open error\n", fname);
        exit(1);
    }

    readsz = fread(ptr, 1, sz, fp);

    magic = COFF_SHORT(((struct COFF_filehdr *)ptr)->f_magic);
    symoff = COFF_LONG(((struct COFF_filehdr *)ptr)->f_symptr);
    nsyms = COFF_LONG(((struct COFF_filehdr *)ptr)->f_nsyms);

    fprintf(stderr, "%d bytes read\n", readsz);

    if(0x14c != magic) {
        fprintf(stderr, "invalid magic number : 0x%x\n", magic);
        exit(1);
    }

    symbol_output_main((struct COFF_filehdr *)ptr);

    fprintf(stderr, "symptr is %ld\n", symoff);
    fprintf(stderr, "nsyms is %ld\n", nsyms);

    fclose(fp);

    return;
}

int main(int argc, char **argv) {
    if (2 != argc) {
        fprintf(stderr, "%s filename\n", argv[0]);
        exit(1);
    }

    printCOFFinfo(argv[1]);

    return 0;
}

最初、COFF_LONG とか COFF_SHORT とかなマクロを見つけてなくって頭を抱えていたのは秘密です。

そしてこれから

Lions' 本を読みます。いやはや。
何かメモが残せれば良いのですがどうなることやら。