求大神,刚入门的小弟遇到难题了

qq_42110658 2018-05-01 12:40:25
实验四 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保存偶数个数。主程序运行的效果类似下图:

...全文
1823 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

547

社区成员

发帖
与我相关
我的任务
社区描述
Cloud Foundry是业界第一个开源PaaS云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。
社区管理员
  • Cloud Foundry社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧