ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux C 环境函数替换方式

Linux C 环境函数替换方式 Linux C 环境函数替换方式全览一、编译时替换Compile-Time1. 宏定义#define2. 弱符号覆盖__attribute__((weak))// 库中定义弱符号 __attribute__((weak)) void *malloc(size_t size) { ... } // 用户代码中定义强符号覆盖 void *malloc(size_t size) { ... } // 链接时自动替换弱符号3.静态链接时同名函数静态链接时用户提供的函数直接覆盖同名的库函数gcc -static -o target target.c my_malloc.c静态库和动态库同名函数冲突时胜负取决于链接顺序和静态库的提取时机。链接时一旦某个版本的符号被解析并绑定另一版本即被忽略。运行时如果静态库版本已嵌入可执行文件动态库版本永远无法覆盖它除非通过LD_PRELOAD强行干预。4. 链接器--wrap选项最推荐有空做下试验gcc -Wl,--wrap,malloc -Wl,--wrap,free -o target target.c hook.cvoid *__wrap_malloc(size_t size) { void *p __real_malloc(size); // 链接器自动提供 __real_ 符号 fprintf(stderr, malloc(%zu) %p\n, size, p); return p; }原理链接器将malloc的引用改为__wrap_malloc二、加载时替换Load-Time5.LD_PRELOAD环境变量LD_PRELOAD./hook.so ./target// hook.c void *malloc(size_t size) { static void *(*real_malloc)(size_t) NULL; if (!real_malloc) real_malloc dlsym(RTLD_NEXT, malloc); void *p real_malloc(size); fprintf(stderr, malloc(%zu) %p\n, size, p); return p; }动态链接器最先加载指定库同名符号覆盖后续库
返回列表