#include <stdio.h> #include <malloc.h> #include <sys/stat.h> typedef int (*PFUNC)(int,int); typedef struct { int Position; int Length; }Fun; typedef struct { int num; Fun *pFun; }Lib; int main() { int FileSize =0; char FileName[] = "code.obj"; FILE * FileHandle = fopen(FileName,"rb"); if(FileHandle!=NULL) { Lib lib; fread(&lib.num,sizeof(char),4,FileHandle); //肯定文件中有幾個函數 lib.pFun =(Fun*)malloc(sizeof(Fun)*lib.num); fread(lib.pFun,sizeof(Fun),lib.num,FileHandle); //讀取文件中第一個函數的信息,(在文件中的)地址和長度 char *instruction= (char*)malloc(sizeof(char)*lib.pFun->Length); //根據函數在內存中爲函數分配空間 fseek(FileHandle,lib.pFun->Position,0); //移動至函數地址,以字節爲單位,0表明文件第一個字節 fread(instruction,sizeof(char),lib.pFun->Length,FileHandle); //讀取函數指令到預留內存 PFUNC pfunc = (PFUNC)instruction; printf("%d \n",pfunc(3,4)); //執行函數 } } /* 說明: 1)沒有附帶函數類型信息,若是支持函數類型信息,那麼能夠說這就是DLL文件 2)讀取文件時能夠把文件想象成一個char A[m],有一個char的指針指向到這個 數組,並在這個數組中先後移動,初始指到A[0],咱們老是從這個指針指向的 地址向後讀取必定的字節複製到另外一個數組,假設指針指向A[0],咱們要讀取 10個字節,讀取完以後,指針定位到A[10],固然,咱們也能夠藉助fseek任意的 移動指針 size_t fread(void *buffer,size_t size,size_t count,FILE *stream) { int i=0; while(stream->ptr!=NULL && i<count) { buffer = stream->ptr; (stream->ptr)++; } return i; } // 假想的函數代碼 int fseek( FILE *stream,long offset,int origin) { stream->ptr = offset + origin } */
CODE.OBJ
01 00 00 00 0C 00 00 00 2B 00 00 00 55 8B EC 81
EC C0 00 00 00 53 56 57 8D BD 40 FF FF FF B9 30
00 00 00 B8 CC CC CC CC F3 AB 8B 45 08 03 45 0C
5F 5E 5B 8B E5 5D C3數組