Linker Double Redirect (IAR EWARM) - PullRequest
2 голосов
/ 03 июня 2019

У меня есть проект IAR STM32, где мне нужно обернуть библиотечную функцию некоторой пользовательской логикой.У меня нет возможности перекомпилировать саму библиотеку, поэтому я хотел бы создать функцию libfunction_shim, которая вызывает исходную libfunction.Используя опцию компоновщика --redirect (--redirect libfunction=libfunction_shim), я могу перенаправлять вызовы исходной функции в шим, включая вызовы внутри самой библиотеки.Однако мне нужно вызвать исходную функцию из шимма.

Если я добавлю еще одно перенаправление (--redirect libfunction_original=libfunction), оно в итоге перенаправит libfunction_original в libfunction_shim, а не в исходное libfunction.Я попытался переупорядочить перенаправления, но он делает то же самое независимо от порядка.

Журнал компоновщика демонстрирует это:

Symbol                     Redirected to          Reason        
-------------              ------                 ------
...
libfunction                libfunction_shim       command line  
libfunction_original       libfunction_shim       command line

Что я хотел бы это:

Symbol                     Redirected to          Reason        
-------------              ------                 ------
...
libfunction                libfunction_shim       command line  
libfunction_original       libfunction            command line

Возможно ли это сделать с помощью компоновщика?

1 Ответ

2 голосов
/ 03 июня 2019

Это невозможно с помощью перенаправления компоновщика, вы должны написать свою функцию shim определенным образом. Полное описание доступно в руководстве (стр. 225 в версии 8.40.1), но подытожим: сначала назовите шим $sub$$libfunction, где libfunction - имя функции для тени. Изнутри шим можно использовать $super$$libfunction для вызова оригинальной версии libfunction. Минимальный пример показан ниже.

extern void $Super$$foo(void);

void $Sub$$foo(void)
{
  $Super$$foo(); /* calls the original foo() function */
}
...