В 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_mallocmsgstr "; если вы это сделаете, ассемблер может разрешить вызов до того, как компоновщик сможет его обернуть"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.

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

Как насчет:

#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
Другие вопросы по тегам