В 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()
... выполняются на заказ. Некоторые из них являются встроенными функциями, а некоторые - библиотечными функциями.
3 ответа
Линкер GNU (ld) поддерживает --wrap=functionname
параметр. Я просто процитирую документацию со страницы руководства, так как она содержит пример, который должен делать именно то, что вам нужно:
--wrap = символ Используйте функцию-обертку для символа. Любая неопределенная ссылка на символ будет преобразована в "__wrap_symbol". Любая неопределенная ссылка на "__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
msgstr "; если вы это сделаете, ассемблер может разрешить вызов до того, как компоновщик сможет его обернуть"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 <my_environment.h>
#undef malloc
int malloc(size_t sz)
{
return my_malloc(sz);
}
#define malloc my_malloc
// use your malloc here