В 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