C 共享对象本身显式调用内部函数

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 如何在我的库中明确地调用它自己的函数 注意:我的函

我一直在重新编写一些libC函数,这些函数被合并到我的共享对象库中。其中一些函数在内部调用它们自己

现在的问题是,当我从另一个程序中使用
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);
}