在C中,是否可以将导出的函数名称更改为不同的名称?
所有。
我想链接一个调用malloc()
函数的库。 但是,我的目标环境是不同的, malloc()
作为内联函数提供。
如何使库对malloc()
的调用直接指向我的目标环境的malloc()
例程?
是否可以通过任何方式更改导出的函数名称? 如果是这样,我可以先编码my_malloc()
并将其导出为malloc()
并将库链接到该库:
#include // malloc() is inline function declared there void my_malloc (void) { malloc (void); }
更具体地说,该库是来自linux发行版的库,因此它依赖于libc。 但我的环境是嵌入式的,没有libc库, malloc()
, free()
,…是自定义实现的。 一些是内联函数,一些是库函数。
GNU链接器(ld)支持--wrap=functionname
参数。 我只是引用手册页中的文档,因为它包含了一个应该完全符合您需要的示例:
–wrap = symbol对符号使用包装函数。 任何未定义的符号引用都将解析为“__wrap_symbol”。 对“__real_symbol”的任何未定义引用都将解析为符号。
这可以用于为系统function提供包装器。 包装函数应该被称为“__wrap_symbol”。 如果希望调用系统函数,则应调用“__real_symbol”。
这是一个简单的例子:
void * __wrap_malloc (size_t c) { printf ("malloc called with %zu\n", c); return __real_malloc (c); }
如果使用
--wrap malloc
将其他代码与此文件链接,则对“malloc
”的所有调用都将调用函数"__wrap_malloc
”。 “__real_malloc
”中对“__wrap_malloc
”的调用将调用真正的“malloc
”函数。您可能还希望提供“
__real_malloc
”函数,以便不使用--wrap
选项的链接将成功。 如果这样做,则不应将“__real_malloc
”的定义放在与“__real_malloc
”相同的文件中; 如果这样做,汇编器可以在链接器有机会将其包装到“malloc
”之前解析调用。
我认为alias
属性可能会解决您的问题:
alias ("target") The alias attribute causes the declaration to be emitted as an alias for another symbol, which must be specified. For instance, void __f () { /* Do something. */; } void f () __attribute__ ((weak, alias ("__f"))); defines `f' to be a weak alias for `__f'. In C++, the mangled name for the target must be used. It is an error if `__f' is not defined in the same translation unit. Not all target machines support this attribute.
关于什么:
#define malloc my_malloc #include #undef malloc int malloc(size_t sz) { return my_malloc(sz); } #define malloc my_malloc // use your malloc here