いくつか
今日は私事都合にて自宅作業でした。これまでも数度経験があるんですが、ペースが掴めず異様に疲れます。今日もへろへろ状態ッス。沖縄にも 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' 本を読みます。いやはや。
何かメモが残せれば良いのですがどうなることやら。