C 共享对象本身显式调用内部函数
我一直在重新编写一些libC函数,这些函数被合并到我的共享对象库中。其中一些函数在内部调用它们自己 现在的问题是,当我从另一个程序中使用C 共享对象本身显式调用内部函数,c,shared-libraries,C,Shared Libraries,我一直在重新编写一些libC函数,这些函数被合并到我的共享对象库中。其中一些函数在内部调用它们自己 现在的问题是,当我从另一个程序中使用dlsym时,dlsym提供的函数(内部使用需要内部函数)将调用libC的函数,而不是我在库中重新编码的函数 下面是一个简单的例子: lib.c gcc main.c-ldl $ ./a.out Calling LIB's Calloc 如您所见,只调用来自lib的calloc函数,而不调用内部memset 如何在我的库中明确地调用它自己的函数 注意:我的函
dlsym
时,dlsym
提供的函数(内部使用需要内部函数)将调用libC的函数,而不是我在库中重新编码的函数
下面是一个简单的例子:
lib.c
gcc main.c-ldl
$ ./a.out
Calling LIB's Calloc
如您所见,只调用来自lib的calloc
函数,而不调用内部memset
如何在我的库中明确地调用它自己的函数
注意:我的函数必须以与libC相同的方式调用,因为它也必须使用LD_PRELOAD
如何在我的库中明确地调用它自己的函数
最好的方法可能是为自己的函数指定不同的名称。例如,在他们的名字前面加上一致的前缀:my_strlen
,my_printf
,等等。。然后,当库打算调用中的其他函数时,只使用这些名称。愚蠢的例子:
size_t my_strlen(const char *s) {
return *s ? (1 + my_strlen(s + 1)) : 0;
}
要使外部调用方调用这些函数来代替它们的同名函数,请插入包装函数。例如:
size_t strlen(const char *s) {
return my_strlen(s);
}
但是,同样,不要依赖于库中的包装器。如果愿意,您甚至可以将包装器拆分为单独的库
这里的想法是尽量减少你接触链接器游戏和动态链接效果。当您需要替换自己的标准库函数实现时,您无法完全避免这些问题,但通过这种方式,您可以减少它们给您带来麻烦的范围。听起来就像我需要的那样。不知道为什么我自己没想到。谢谢。还要使您的本地函数
保持静态
——您不想共享它们。
size_t my_strlen(const char *s) {
return *s ? (1 + my_strlen(s + 1)) : 0;
}
size_t strlen(const char *s) {
return my_strlen(s);
}