C共享库:静态变量初始化&x2B;进程间的全局变量可见性
我想修改现有的共享库,使其根据使用共享库的应用程序使用不同的内存管理例程 (目前)将有两个系列的内存管理例程:C共享库:静态变量初始化&x2B;进程间的全局变量可见性,c,linux,ubuntu,shared-libraries,C,Linux,Ubuntu,Shared Libraries,我想修改现有的共享库,使其根据使用共享库的应用程序使用不同的内存管理例程 (目前)将有两个系列的内存管理例程: 标准malloc、calloc等函数 malloc、calloc等的专门版本 我已经想出了一个解决这个问题的潜在方法(在一些人的帮助下)。目前仍有一些灰色地带,我希望得到一些关于我的建议的反馈 以下是我打算实施修改的方式: 用my_malloc/my_calloc等替换对malloc/calloc等的现有调用。这些新函数将调用正确分配的函数指针,而不是调用硬编码的函数名 为共享库提
- 标准malloc、calloc等函数
- malloc、calloc等的专门版本
顺便说一句,由于缺乏具体问题,我正在Linux(Ubuntu)上构建库。这篇文章很长,本可以写得更简洁,而且没有一个问号 现在来解决您的问题: 共享库的静态数据(您称之为“全局变量”)是每个进程的数据。一个进程中的全局变量不会干扰另一个进程中的全局变量。不需要互斥 在C语言中,不能限制[1]谁可以调用函数。任何知道它的名字或有指向它的指针的人都可以调用它。您可以编写
initAPI()
,这样,如果程序不是第一个调用的库函数,它就会明显地中止程序(使其崩溃)。你是图书馆的作者,你设定了游戏规则,你对不遵守规则的程序员没有义务
[1] 您可以使用static声明函数,这意味着只有同一翻译单元中的代码才能按名称调用函数;任何试图获得指向它的指针的人仍然可以通过指针调用它。这些函数不是从库中“导出”的,因此这不适用于您的场景。-1因为缺少具体问题。这篇文章很长,本可以写得更简洁,而且没有一个问号 现在来解决您的问题: 共享库的静态数据(您称之为“全局变量”)是每个进程的数据。一个进程中的全局变量不会干扰另一个进程中的全局变量。不需要互斥 在C语言中,不能限制[1]谁可以调用函数。任何知道它的名字或有指向它的指针的人都可以调用它。您可以编写
initAPI()
,这样,如果程序不是第一个调用的库函数,它就会明显地中止程序(使其崩溃)。你是图书馆的作者,你设定了游戏规则,你对不遵守规则的程序员没有义务
[1] 您可以使用static声明函数,这意味着只有同一翻译单元中的代码才能按名称调用函数;任何试图获得指向它的指针的人仍然可以通过指针调用它。这些函数不是从库中“导出”的,因此这不适用于您的场景。您很容易要求您的初始化函数是:
- 从主线程调用
- 客户可以只调用一次
- 客户端可以通过参数提供可选的函数指针
- 从主线程调用
- 客户可以只调用一次
- 客户端可以通过参数提供可选的函数指针
- 如果
void __attribute__ ((constructor)) initAPI(void);
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>
void * malloc(size_t size) {
static void * (*func)(size_t) = NULL;
void * ret;
if (!func) {
/* get reference to original (libc provided) malloc */
func = (void *(*)(size_t)) dlsym(RTLD_NEXT, "malloc");
}
/* code to execute before calling malloc */
...
/* call original malloc */
ret = func(size);
/* code to execute after calling malloc */
...
return ret;
}