.o をロードするダイナミックローダを書いてみました。
http://shinh.skr.jp/koneta/mydl.tgz
int add(int x, int y) { return x+y; }みたいなコードを gcc -c add.c とコンパイルしておき、
#include <stdio.h>
#include "mydl.h"
int main() {
void* handle = mydlopen("add.o");
int (*fp) (int, int) = mydlsym(handle, "add");
char* p = (char*)fp;
printf("add (%p):\n", fp);
while (*p != (char)0xc3) {
printf("%02x ", (*p++) & 0xff);
}
printf("c3\n");
printf("2+3=%d\n", fp(2, 3));
mydlclose(handle);
return 0;
}てな感じでやってやると出力が、
add (0x4001c034): 55 89 e5 8b 45 0c 03 45 08 c9 c3 2+3=5
などと。1行目が関数の置かれてる位置、2行目は関数の開始から ret までのダンプ、3行目が 2 と 3 を引数に関数を呼んでみたところ。
一応再配置もやってますが全然完全では無い気がします。
ObjC はどこへ。