Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: KEIL, ARM - изменить видимость символа в библиотеке
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
KnightIgor
Добрый день! [(с) С.Капица]

Есть необходимость "перехватить" функцию efs_find (из файловой системы KEIL).

Как известно, компилятор предлагает механизм $Super$ | $Sub$ для реализации подобия наследования (patch). Однако в библиотеке функция efs_find имеет атрибут STV_HIDDEN, поэтому (предположительно) "долларовый" механизм не работает. К слову, подобная функция fat_find "переписывается" без проблем.

Вопрос: нужна иформация о формате объектного файла .o /библиотеки .lib, либо программка, чтобы "хакнуть" функцию и сделать ее STV_DEFAULT.

Кто знает?

TIA.
scifi
Может быть, просто подменить препроцессором при компиляции?
KnightIgor
Цитата(scifi @ Mar 27 2012, 11:34) *
Может быть, просто подменить препроцессором при компиляции?

Речь идет не о полной замене библиотечной функции.
"Перехватить" с использованием $Super$$ и $Sub$$ означает вначале вызвать "огонь на себя", когда откуда-то вызывается встроенная библиотечная функция, и проделать дополнительные операции в своем коде либо до, либо после вызова самой библиотечной функции. Пример:
Код
extern int $Super$$fputc(int c, FILE *f);    // Original library function
int $Sub$$fputc(int c, FILE *f) {    // Patch that substitutes
                                    // the library one...
  if (f == stdout)   return sendchar(c);
  else             return $Super$$fputc(c, f); // call the "default" library function    
}

В этом случае, вызов к функции fputc() приходит сюда, а затем можно вызвать "оригинальную" функцию fputc(). Это такое как бы наследование.
scifi
То есть исходники кода, вызовы из которого надо перехватывать, недоступны?
KnightIgor
Цитата(scifi @ Mar 27 2012, 12:43) *
То есть исходники кода, вызовы из которого надо перехватывать, недоступны?

Нет: после RL 4.13 KEIL не предоставляет исходники файловой системы, а только FS_CM3.LIB. Прикол в том, что fat_find "перехватить" можно, а efs_find - нет, т.к. - предположительно - efs_find спрятана (HIDDEN или PROTECTED). ВОт я бы хотел "подкорректировать" бинарник, переделав атрибут указаной функции.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.