C 如何用自定义代码包装库函数?
我有一个实现C 如何用自定义代码包装库函数?,c,function,overriding,C,Function,Overriding,我有一个实现malloc的库。我想用一个自定义的malloc函数重写这个函数,该函数执行一些操作,然后调用库的malloc函数 如何重新定义符号malloc而不丢失库中的函数?使用库函数的名称创建新函数不是一个好的做法。如果您想创建这样一个函数,那么新函数可以正常工作,但不能使用库函数。如果要创建自己版本的printf(),可以这样做,但不能使用原始的printf()函数,因为您正在重写它。使用库函数的名称创建新函数不是一个好做法。如果您想创建这样一个函数,那么新函数可以正常工作,但不能使用库函
malloc
的库。我想用一个自定义的malloc函数重写这个函数,该函数执行一些操作,然后调用库的malloc函数
如何重新定义符号
malloc
而不丢失库中的函数?使用库函数的名称创建新函数不是一个好的做法。如果您想创建这样一个函数,那么新函数可以正常工作,但不能使用库函数。如果要创建自己版本的printf(),可以这样做,但不能使用原始的printf()函数,因为您正在重写它。使用库函数的名称创建新函数不是一个好做法。如果您想创建这样一个函数,那么新函数可以正常工作,但不能使用库函数。如果要创建自己版本的printf(),可以这样做,但不能使用原始的printf()函数,因为您正在重写它。使用库函数的名称创建新函数不是一个好做法。如果您想创建这样一个函数,那么新函数可以正常工作,但不能使用库函数。如果要创建自己版本的printf(),可以这样做,但不能使用原始的printf()函数,因为您正在重写它。使用库函数的名称创建新函数不是一个好做法。如果您想创建这样一个函数,那么新函数可以正常工作,但不能使用库函数。如果您想创建自己版本的printf(),您可以这样做,但不能使用原始printf()函数,因为您正在重写它。GNU链接器提供了--wrap symbol
标志来围绕现有函数包装自定义函数
正如您在此处看到的,最后一个标志:
对符号使用包装函数。对符号
的任何未定义引用将解析为\uuu wrap\u symbol
。对\uu real\u symbol
的任何未定义引用将解析为symbol
。这可用于为系统函数提供包装器。应该调用包装函数\uuwrap\u symbol
。如果希望调用系统功能,则应调用\uuu real\u symbol
。以下是一个简单的例子:
void *
__wrap_malloc (int c) {
printf ("malloc called with %ld\n", c);
return __real_malloc (c);
}
如果使用--wrap malloc
将其他代码链接到此文件,则对malloc
的所有调用都将调用函数\uuuwrap\umalloc
。在\uu wrap\u malloc
中调用\uu real\u malloc
将调用realmalloc
函数。您可能还希望提供一个uuu real_malloc函数,这样没有--wrap
选项的链接将成功。如果这样做,则不应将\uuuu real\u malloc
的定义与\uuuu wrap\u malloc放在同一个文件中;如果您这样做,汇编程序可能会在链接器有机会将调用包装到malloc之前解析调用
GNU链接器提供了
--wrap symbol
标志来围绕现有函数包装自定义函数
正如您在此处看到的,最后一个标志:
对符号使用包装函数。对符号
的任何未定义引用将解析为\uuu wrap\u symbol
。对\uu real\u symbol
的任何未定义引用将解析为symbol
。这可用于为系统函数提供包装器。应该调用包装函数\uuwrap\u symbol
。如果希望调用系统功能,则应调用\uuu real\u symbol
。以下是一个简单的例子:
void *
__wrap_malloc (int c) {
printf ("malloc called with %ld\n", c);
return __real_malloc (c);
}
如果使用--wrap malloc
将其他代码链接到此文件,则对malloc
的所有调用都将调用函数\uuuwrap\umalloc
。在\uu wrap\u malloc
中调用\uu real\u malloc
将调用realmalloc
函数。您可能还希望提供一个uuu real_malloc函数,这样没有--wrap
选项的链接将成功。如果这样做,则不应将\uuuu real\u malloc
的定义与\uuuu wrap\u malloc放在同一个文件中;如果您这样做,汇编程序可能会在链接器有机会将调用包装到malloc之前解析调用
GNU链接器提供了
--wrap symbol
标志来围绕现有函数包装自定义函数
正如您在此处看到的,最后一个标志:
对符号使用包装函数。对符号
的任何未定义引用将解析为\uuu wrap\u symbol
。对\uu real\u symbol
的任何未定义引用将解析为symbol
。这可用于为系统函数提供包装器。应该调用包装函数\uuwrap\u symbol
。如果希望调用系统功能,则应调用\uuu real\u symbol
。以下是一个简单的例子:
void *
__wrap_malloc (int c) {
printf ("malloc called with %ld\n", c);
return __real_malloc (c);
}
如果使用--wrap malloc
将其他代码链接到此文件,则对malloc
的所有调用都将调用函数\uuuwrap\umalloc
。在\uu wrap\u malloc
中调用\uu real\u malloc
将调用realmalloc
函数。您可能还希望提供一个uuu real_malloc函数,这样没有--wrap
选项的链接将成功。如果这样做,则不应将\uuuu real\u malloc
的定义与\uuuu wrap\u malloc放在同一个文件中;如果您这样做,汇编程序可能会在链接器有机会将调用包装到malloc之前解析调用
GNU链接器提供了
--wrap symbol
标志来围绕现有函数包装自定义函数
正如您在此处看到的,最后一个标志:
对符号使用包装函数。对符号
的任何未定义引用将解析为\uuu wrap\u symbol
。对\uu real\u symbol
的任何未定义引用将解析为symbol
。这可以用来公关