實驗四 interposition lab
【開發語言及實作平臺或實驗環境】
CentOS/Linux
【實驗目的】
1、理解包裝函式。
2、掌握運行時打樁技術。
【實驗內容】
一、對malloc和free函式打樁
首先撰寫包裝函式malloc和free。
示例程式A:mymalloc.c
#ifdef RUNTIME
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
void *malloc(size_t size)
{
void *(*mallocp)(size_t size);
char *error;
mallocp = dlsym(RTLD_NEXT, "malloc");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
char *ptr = mallocp(size);
printf("malloc(%d) = %p\n", (int)size, ptr);
return ptr;
}
void free(void *ptr)
{
void (*freep)(void *) = NULL;
char *error;
if(!ptr) return;
freep = dlsym(RTLD_NEXT, "free");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
freep(ptr);
printf("free(%p)\n", ptr);
}
#endif
編譯mymalloc.c并生成共享庫mymalloc.so。
撰寫主程式:int.c
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p = malloc(32);
free(p);
return 0;
}
編譯并運行,可見沒有任何輸出
接下來用包裝函式打樁運行(不要重新編譯int.c)
二、本次實驗內容(須提交實驗報告)
對rand函式打樁,每次取亂數時,累計奇偶數的個數并輸出。
主程式:randout.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i, a[100];
srand(time(NULL));
for (i = 0; i < 100; i ++)
a[i] = rand();
for (i = 0; i < 100; i ++)
printf("%d ", a[i]);
printf("\n");
}
包裝函式(部分代碼):rand.c
#ifdef RUNTIME
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
static int n1 = 0, n2 = 0;
/* rand wrapper function */
int rand()
{
/* insert codes */
}
#endif
補充剩余代碼,其中n1保存奇數個數,n2保存偶數個數。主程式運行的效果類似下圖:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/51961.html
