库打桩机制

1.编译时打桩
linux>gcc -DCOMPILETIME -c mymalloc.c
linux>gcc -I. -o intc int.c mymalloc.o
linux>./intc
使用-I.参数,它会使C预处理器会在搜索通常的系统目录之前,现在当前目录中查找

mymalloc.c:
#ifdef COMPILETIME
#include <stdio.h>
#include <malloc.h>
void * mymalloc(size_t size){
    void * ptr=malloc(size);
    printf("malloc(%d)=%p\n",(int)size,ptr);
    return ptr;
}
void myfree(void * ptr){
    free(ptr);
    printf("free(%p)\n",ptr);
}
#endif

malloc.h:
#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)
void * mymalloc(size_t size);
void myfree(void * ptr);

int.c:
#include <stdio.h>
#include <malloc.h>
int main(){
    int * p=malloc(32);
    free(p);
    return 0;
}

  

2.链接时打桩
Linux静态连接器支持使用--wrap f标志来进行链接时打桩,链接器会将f解析为__wrap_f,还要把对符号__real_f解析为f。
linux>gcc -DLINKTIME -c mymalloc.c
linux>gcc -c int.c
linux>gcc -Wl,--wrap,malloc --Wl,--wrap,free -o intl int.o mymalloc.o

mymalloc:
#ifdef LINKTIME
#include <stdio.h>
void * __real_malloc(size_t size);
void __real_free(void * ptr);
void * __wrap_malloc(size_t size){
	void * ptr=__real_malloc(size);
	printf("malloc(%d)=%p\n",(int)size,ptr);
	return ptr;
}
void __wrap_free(void * ptr){
	__real_free(ptr);
	printf("free(%p)\n",ptr);
}
#endif

malloc.h:
#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)
void * mymalloc(size_t size)
void myfree(void * free)

int.c
#include <stdio.h>
#include <malloc.h>
int main()
{
	int * p=malloc(32);
	free(p);
	return 0;
}

  

3.运行时打桩
通过设置LD_PRELOAD环境变量,来使动态链接器先搜索LD_PRELOAD库,然后再搜索其他的库。
linux>gcc -DRUNTIME -shared -fpic -o mymalloc.so mymalloc.c -ldl
linux>gcc -o intr int.c
linux>LD_PRELOAD="./mymalloc.so" ./intr

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

其他两个一样

  

原文地址:https://www.cnblogs.com/JsonZhangAA/p/8870777.html

时间: 2024-10-28 04:44:34

库打桩机制的相关文章

自己动手写客户端UI库——事件机制(设计思路大放送)

在上一篇文章中我们创建了一个Button控件,并把这个控件显示在界面上, 在这一篇文章中,我们将为这个控件增加一个事件和一个方法 一:怎么绑定事件的问题 在Winform中,我们对一个按钮绑定事件的方式如下(这是真正的事件) 然而,在WUI库中,为一个按钮绑定事件是这样的,(这不是一个事件,这只是调用了一个方法,给这个方法传递了一个i额委托) 问题: 为什么会有这样的差异呢?实在是无奈之举(也希望园友多提意见) 回答: 我们在给一个WUI按钮绑定事件的时候,这个按钮有可能已经呈现在界面上了:也有

《深入理解计算机系统(原书第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 和第2版相比,本版内容上*大的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础.主要更新如下: 基于x86-64,大量地重写代码,首次介绍对处理浮点数据的程序的机器级支持. 处理器体系结构修改为支持64位字和操作的设计. 引入更多的功能单元和更复杂的控制逻辑,使基于程序数据流表示的程序性能模型预测更加可靠. 扩充关于用GOT和PLT创建与位置无关代码的讨论,描述了更加强大的链接技术(比如库打桩). 增加了对信号处理程序

2018-2019-1 20165327 《信息安全系统设计基础》第一周学习总结

知识总结 第一章hello程序的生命周期 1.hello程序是从源程序开始的.创建并保存hello.c的文本文件.信息=比特流+上下文 vi hello.c 编译 hello程序分步编译 1.预处理(包括打开头文件和翻译宏) hello.c->hello.i gcc -E hello.c -o hello.i 这时打开hello.i发现,短短几行代码已被展开为一千多行. 2.编译 hello.i->hello.s gcc -S hello.i -o hello.s 这时打开hello.s发现是

《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)

继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(index).我们知道,<高性能SQL调优精要与案例解析>一书中也再三强调索引对SQL调优的重要性,可是上篇文章中也谈到,只看案例和解决问题的具体方法,而不掌握SQL调优的基础知识,是没有用的,我们必须做到知其然,更要知其所以然,才能做到融会贯通,活学活用,进而将SQL调优技术掌握到炉火纯青的地步.

Linux - 动态(Dynamic)与静态(Static)函数库

首先我们要知道的是,函式库的类型有哪些?依据函式库被使用的类型而分为两大类,分别是静态 (Static) 与动态 (Dynamic) 函式库两类. 静态函式库的特色: 扩展名:(扩展名为 .a) 这类的函式库通常扩展名为 libxxx.a 的类型: 编译行为: 这类函式库在编译的时候会直接整合到运行程序当中,所以利用静态函式库编译成的文件会比较大一些喔: 独立运行的状态: 这类函式库最大的优点,就是编译成功的可运行档可以独立运行,而不需要再向外部要求读取函式库的内容 (请参照动态函式库的说明).

使用 GNU Libtool 创建库

介绍 在不同的系统中建立动态链接库的方法有很大的差别,这主要是因为每个系统对动态链接库的看法和实现并不相同,以及编译器对动态链接库支持的选项也不太一样.对于开发人员,如果尝试将使用动态库的软件在这些系统之间移植,需要参考枯涩难懂的系统手册,以及修改相应的 Makefile,这一工作是乏味的,并且具有一定的难度. 使用 GNU Libtool 可以容易的在不同的系统中建立动态链接库.它通过一个称为 Libtool 库的抽象,隐藏了不同系统之间的差异,给开发人员提供了一致的的接口.对于大部分情况,开

MS Sql Server 中主从库的配置和使用介绍(转)

网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库. 主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的查询操作:从库负责查询较旧数据,做一些对实效性要求较小的分析,报表生成的工作.这样做将数据库的压力分担到两台服务器上从而保证整个系统响应的及时性. SQL Server提供了复制机制来帮我们实现主从库的机制.我们看下如何在sql server 2005中实践: 实践前需要新创建一个Test的数据库

XMPPclient库Smack 4.0.6一个版本的开发

XMPPclient库Smack 4.0.6版开发之中的一个 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Smack库概述 Smack是一个开源.易用的XMPP/Jabberclient库,它使用Java语言开发,由Jive Software开发. Smack的长处是编程简单. Smack的缺点是其API并不是为大量并发用户设计,每一个客户都要1个线程,占用资源相对较,因此用Smack做模拟測试时,1台机器仅仅能模拟有限(数千个)客户. 截止

XMPP客户端库Smack 4.0.6版开发之一

一.Smack库概述 Smack是一个开源.易用的XMPP/Jabber客户端库,它使用Java语言开发,由Jive Software开发. Smack的优点是编程简单. Smack的缺点是其API并非为大量并发用户设计,每个客户都要1个线程,占用资源相对较,因此用Smack做模拟测试时,1台机器只能模拟有限(数千个)客户. 截止2014年11月27日,Smack库已经发展到4.0.6版. 最新的好消息是Smack在4.1.0版后将直接支持Android系统,而无需再使用以前的Smack移植版a