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

 
 
 
Reply to this topicStart new topic
> KEIL, ARM - изменить видимость символа в библиотеке, Переназначение STV_HIDDEN
KnightIgor
сообщение Mar 27 2012, 10:23
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Добрый день! [(с) С.Капица]

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

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

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

Кто знает?

TIA.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 27 2012, 10:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Может быть, просто подменить препроцессором при компиляции?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 27 2012, 11:32
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(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(). Это такое как бы наследование.

Сообщение отредактировал KnightIgor - Mar 27 2012, 11:34
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 27 2012, 11:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



То есть исходники кода, вызовы из которого надо перехватывать, недоступны?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 27 2012, 11:46
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(scifi @ Mar 27 2012, 12:43) *
То есть исходники кода, вызовы из которого надо перехватывать, недоступны?

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

Сообщение отредактировал KnightIgor - Mar 27 2012, 11:48
Go to the top of the page
 
+Quote Post

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

 


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


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