реклама на сайте
подробности

 
 
> Менеджер динамической памяти в IAR, как подменить на свой?
Andy Mozzhevilov
сообщение Apr 21 2009, 14:58
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Функции malloc, free, realloc, calloc реализованы в стандартной библиотеке, чтобы ими пользоваться включаем stdlib.h:
Код
#include <stdlib.h>

void main (void)
{
    void * pSlon;

    pSlon = malloc(1000);
}

Вопрос: как, не внося изменения в системный stdlib.h, объяснить IAR-у чтобы он использовал мою реализацию функий malloc, free, realloc, calloc взамен библиотечных? То есть чтобы исходник выглядел так же, как и выше, но реализация функций была заменена?
Есть какой-то кошерный способ это сделать?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 21 2009, 15:48
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Andy Mozzhevilov @ Apr 21 2009, 17:58) *
Вопрос: как, не внося изменения в системный stdlib.h, объяснить IAR-у чтобы он использовал мою реализацию функий malloc, free, realloc, calloc взамен библиотечных?
Насколько я понимаю - просто написать свои функции с такими же именами. Они будут подлинковываться взамен библиотечных, точно так же как подлинковываются putchar(), __write()


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Apr 21 2009, 19:41
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(Сергей Борщ @ Apr 21 2009, 19:48) *
Насколько я понимаю - просто написать свои функции с такими же именами. Они будут подлинковываться взамен библиотечных, точно так же как подлинковываются putchar(), __write()

там не все так просто.
В stdlib malloc определяется как:
Код
#ifndef _NO_DEFINITIONS_IN_HEADER_FILES
#ifndef _DO_NOT_INLINE_MALLOC

#pragma inline
void * malloc(size_t _S)
{
  return _GLUE(__DEF_PTR_MEM__,_malloc(_S));

}

#endif /* _DO_NOT_INLINE_MALLOC */
#endif /* _NO_DEFINITIONS_IN_HEADER_FILES */

После препроцессора из stdlib.h получается:
Код
__intrinsic void * malloc(size_t);

...

__intrinsic void __data * __data_malloc(__data_size_t);


#pragma inline
void * malloc(size_t _S)
{
  return __data_malloc(_S);
}

В листинге получается:
Код
    133              pSlon = malloc(1000);
   \   00000004   64409FE5           LDR      R4,??main_0     ;; pSlon
   \   00000008   FA0FA0E3           MOV      R0,#+1000
   \   0000000C   ........           BL       __data_malloc
   \   00000010   000084E5           STR      R0,[R4, #+0]


я так понимаю, можно как-то рулить определениями _NO_DEFINITIONS_IN_HEADER_FILES и/или _DO_NOT_INLINE_MALLOC , в которые завернуты определения функций менеджера динамической памяти в stdlib.h, но вопрос - как сделать кошерно? В документации пока не нашел.




Цитата(HARMHARM @ Apr 21 2009, 19:36) *
Я вообще-то не очень разбирался, но есть два метода:
1) Наглый:
...
#define malloc(size) myMalloc(size)
#define free(ptr) myFree(ptr)

это не так, как хотелось бы.

Цитата
2) Правильный:
Можно почитать в главе "Overriding library modules" в ARM® IAR C/C++ Compiler Reference Guide. Суть в подключении своих функций, они должны в командной строке линкера быть перед библиотечными.

Завтра попробую еще почитать, сегодня уже голова плохо работает.
Цитата
Вы же cstartup стандартный заменяете?

Нет, зачем? Мне функциональности low_level_init() более чем достаточно.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 22 2009, 07:53
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Andy Mozzhevilov @ Apr 21 2009, 22:41) *
Код
#pragma inline
void * malloc(size_t _S)
{
  return __data_malloc(_S);
}
значит надо подменить __data_malloc(). Попробовал в 4.30А - получилось:
Код
file1.cpp:
#include    <stdlib.h>
extern "C" void * __data_malloc(size_t size)
{
    return (void *)0x123;
}
file2.cpp:
#include    <stdlib.h>

void * Temp;
_C_LIB_DECL
#pragma language=extended
#pragma location="ICODE"
int __low_level_init(void)
{
    Temp = malloc(5);

Посмотрел список модулей в библиотеке при помощи xlib (xlib.exe -c "LIST-ENTRIES dl4tptinl8n.r79 "):
Код
       1.  Lib  ?low_level_init
             Ent   __low_level_init
....
     125.  Lib  ?free
             Ent   _Instansiator_free
             Ent   __data_free
             Ent   free
...
     177.  Lib  ?malloc
             Ent   ?init?tab?DATA_Z
             Ent   _Instansiator_malloc
             Ent   __data_Aldata
             Ent   __data_malloc
             Ent   malloc
Никаких намеков на то, что могут быть "подменяемые" и "неподменяемые" функции.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 12:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01802 секунд с 7
ELECTRONIX ©2004-2016