В C, возможно ли изменить имя экспортируемой функции на другую?
все.
Я хочу связать библиотеку, которая вызывает функцию malloc()
.
Однако моя целевая среда отличается от
malloc()
предоставляется как встроенная функция.
Как я могу вызвать вызов библиотеки malloc()
на
моя целевая среда malloc()
процедура?
Можно ли изменить имя экспортируемой функции? Если так
Я могу сначала закодировать my_malloc()
и экспортировать его как malloc()
и ссылку
библиотека к этому:
#include <my_environment.h> // malloc() is inline function declared there
void my_malloc (void) {
malloc (void);
}
Более конкретно,
библиотека является одной из дистрибутивов Linux, поэтому она зависит от libc.
Но моя среда встроена одна и не имеет библиотеки libc, а malloc()
, free()
,... реализована на заказ. Некоторые из них являются встроенными функциями, а некоторые - библиотечными.
Ответы
Ответ 1
Компонент GNU (ld) поддерживает параметр --wrap=functionname
. Я просто приведу документацию с man-страницы, так как она включает пример, который должен делать именно то, что вам нужно:
- wrap = symbol Используйте функцию обертки для символа. Любая ссылка undefined на символ будет разрешена на "__wrap_symbol". Любая ссылка undefined на "__real_symbol" будет разрешена к символу.
Это можно использовать для предоставления обертки для системной функции. Функцию обертки следует называть "__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
"в том же файле, что и" __wrap_malloc
"; если вы это сделаете, ассемблер может разрешить вызов до того, как у компоновщика будет возможность связать его с "malloc
".
Ответ 2
Я думаю, что атрибут 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.
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
Ответ 3
Как насчет:
#define malloc my_malloc
#include <my_environment.h>
#undef malloc
int malloc(size_t sz)
{
return my_malloc(sz);
}
#define malloc my_malloc
// use your malloc here