深入理解计算机系统--链接
编译时打桩,编译命令
gcc -DCOMPILETIME -c my_malloc.c
gcc -I. -o main main.c my_malloc.o
//my_malloc.h
#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)void *mymalloc(size_t size);
void myfree(void *ptr);//my_malloc.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//main.c
#include <stdio.h>
#include <malloc.h>int main() {int *p = malloc(sizeof(int));free(p);return 0;
}
链接时打桩,编译命令
gcc -DLINKTIME -c my_malloc.c
gcc -c main.c
gcc -Wl,--wrap,malloc -Wl,--wrap,free -o main main.o my_malloc.o
//my_malloc.c
#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//main.c
#include <stdio.h>
#include <malloc.h>int main() {int *p = malloc(sizeof(int));free(p);return 0;
}
运行结果
malloc(4) = 0x746010
free(0x746010)
运行时库打桩机制
对 malloc,free函数的包装
#define _GUN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
//#define NULL 0;void *malloc(size_t size) {void *(*malloc_func)(size_t size);char *error;
/* void *handle = dlopen("/lib64/libc.so.6", RTLD_LAZY);if (!handle) {fprintf (stderr, "%s ", dlerror());exit(1);}
*/malloc_func = dlsym(RTLD_NEXT, "malloc");if((error=dlerror()) != NULL) {fputs(error,stderr);exit(1);}char *ptr = malloc_func(size);printf("malloc(%d) = %p\n", (int)size, ptr);return ptr;
}void free(void *ptr) {void (*free_func) (void *) = NULL;char *error;if(!ptr) {return;}free_func = dlsym(RTLD_NEXT, "free");if((error=dlerror()) != NULL) {fputs(error,stderr);exit(1);}free_func(ptr);printf("free (%p)\n",ptr);}
编译命令
gcc -D_GNU_SOURCE -DRUNTIME -shared -fPIC -o mymalloc.so mymalloc.c -ldl
执行
LD_PRELOAD="./mymalloc.so" uptime
运行结果
malloc(37) = 0x2526040
。。。
free (0x2527020)
free (0x2526fe0)
malloc(12) = 0x2526fe0
malloc(12) = 0x2527020
free (0x25273e0)
free (0x2527110)23:44:38 up 349 days, 6:35, 5 users, load average: 0.00, 0.01, 0.05
一些相关的命令
名称 | 含义 |
ar | 创建静态库,插入删除列出和提取成员 |
ldd | 列出一个可执行文件在运行时所需要的共享库 |
gcc | 强大的编译工具 |
nm | 列出一个目标文件的符号表中定义的符号 |
size | 列出目标文件中section的名字和大小 |
objdump |
所有二进制工具之母 能够显示一个目标文件中所有的信息 最大的作用是反汇编.text 片段中的二进制指令 |
readelf |
显示一个目标文件的完整结构 包括ELF头中编码的所有信息,包含size和nm的功能 |
strace | 跟踪调试工具 |
strip | 删除多余的段 |
参考
关于Linux静态库和动态库的分析
程序的编译链接过程
程序运行流程——链接、装载及执行
一些相关的命令
名称 | 含义 |
ar | 创建静态库,插入删除列出和提取成员 |
ldd | 列出一个可执行文件在运行时所需要的共享库 |
gcc | 强大的编译工具 |
nm | 列出一个目标文件的符号表中定义的符号 |
size | 列出目标文件中section的名字和大小 |
objdump |
所有二进制工具之母 能够显示一个目标文件中所有的信息 最大的作用是反汇编.text 片段中的二进制指令 |
readelf |
显示一个目标文件的完整结构 包括ELF头中编码的所有信息,包含size和nm的功能 |
strace | 跟踪调试工具 |
strip | 删除多余的段 |
参考
关于Linux静态库和动态库的分析
程序的编译链接过程
程序运行流程——链接、装载及执行
深入理解计算机系统--链接相关推荐
- 《深入理解计算机系统》第七章 链接
<深入理解计算机系统>第七章 链接 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成 ...
- 深入理解计算机系统-第七章(链接)笔记
深入理解计算机系统-第七章(链接)笔记 背景 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程 这个文件可被加载(拷贝)到存储器中并执行: 链接可以执行于编译时,也就是源代码翻译成机器码 ...
- 深入理解计算机系统——第7章 链接
深入理解计算机系统--第7章 链接 链接 概念 链接( linking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行. 链接在以下三个阶段都可以执行: ...
- 《深入理解计算机系统-程序结构》读书笔记
1.计算机系统漫游 计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序.在<深入理解计算机系统>一书中将会学到很多实践的技巧.例如:了解编译器是如何实现过程调用的.避免缓冲区溢 ...
- csapp 、sicp 、深入理解计算机系统、 计算机程序的构造和解释
CSAPP 第一版的英文版 深入理解计算机系统第一版中文版 这个是csdn账号 这里上传文件大小在10M以内 这个pdf是19+M的 深入理解计算机系统第二版的中文版下载 第一版英文版的介绍原书 ...
- 《深入理解计算机系统》第七章读书笔记
<深入理解计算机系统>第七章读书笔记 第七章:连接 连接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译 ...
- bilibili深入理解计算机系统笔记(1):汇编模拟器能跑了
文章目录 深入理解计算机系统笔记 P1笔记 p2笔记 p3笔记 p4笔记 汇编模拟器(p5-7) 封装访存接口 输出计算机状态 实现指令 call指令的实现 bug 积累 include重复包含的bu ...
- 深入理解计算机系统9个重点笔记
引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容 ...
- 《深入理解计算机系统(英文版.第2版)》
<深入理解计算机系统(英文版.第2版)>china-pub计算机新书推荐 本书双色印刷,计算机软硬件理论结合讲述的经典之作. 页码:1077 基本信息原书名: Computer Syste ...
最新文章
- 编译ONNX模型Compile ONNX Models
- Python 多进程、协程异步抓取英雄联盟皮肤并保存在本地
- signature=2ee20a16234208d4dd8bbd7fe87bb472,sstk-20200428
- 【Android UI设计与开发】第06期:底部菜单栏(一)使用TabActivity实现底部菜单栏
- MakeFile中文手册(免费下载)-徐海兵整理
- c语言网上找程序组合,C语言程序我同学说在网上下的一章一章的小说组合成一个太麻烦,于是 爱问知识人...
- c++中的继承--3(多继承问题,菱形继承)
- 倒计时按钮_办公小技巧:轻松玩转PPT秒针倒计时
- 【Vue】—Vue的基本介绍与插件安装
- vue 背景透明度_Visual Studio 2017 设置透明背景图
- SSL自签名证书制作方法
- 朝花夕拾-不务正业的大学生做了什么比赛?
- scratch优秀案例-双人足球对战赛
- obs显示从服务器断开连接,obs重新连接到服务器
- 产品的设计与分析---用户体验五要素
- Swagger 配置多个接口文档实现 和 实现多包扫描的配置方式
- android中点击头像放大,Android头像下拉缩放动效
- 元引擎视频制作工具 一键生成原创视频软件
- 测量误差(error)的概念
- CMD命令下修改和查看IP地址,DNS,网关