No se puede reemplazar la función __weak en una biblioteca estática, la cual está envuelta en otra biblioteca estática con una definición sólida.
Contexto: Compilador IAR ARM.
Estoy intentando envolver la biblioteca de hardware (“STM32 HAL library”) en una biblioteca con mis agregados y enlazarla con mi ejecutable.
Como en el esquema:
/plataforma
– /biblioteca_hal
– – hal_source.c (con foo() débil)
– hal_portable_source.c (con foo() fuerte)
– plataforma.c (con foo() fuerte)
main.c
CMake tiene esta estructura (código pseudo):
### Hal_Library.cmake
add_library(hal_lib ${HAL_SOURCES})
target_include_directories(hal_lib ${HAL_HEADERS}
### Platform_Library.cmake
include(Hal_Library.cmake)
add_library(platform_lib ${PLATFORM_SOURCES})
target_include_directories(platform_lib${PLATFORM_HEADERS}
target_link_libraries(platform_lib hal_lib)
### CMakeLists.txt
add_subdirectory(./plataforma)
add_executable(my_app main.c)
target_link_libraries(my_app platform_lib )
hal_source.c contiene __weak void Foo(void)
Y! lo llama en sus propias funciones. El proveedor asume que el usuario lo reemplaza con la implementación fuerte void Foo(void) en su código. Y esto funciona, cuando se agrega strong_foo_realization.c directamente en el ejecutable.
Pero estoy tratando de reemplazarlo en platform_lib con strong_foo_realization.c agregado y donde hal_lib está vinculada.
Y obtengo que __weak Foo() no es reemplazada por mi __strong Foo().
Según el archivo *.map, strong_foo_realization.c nunca es agregado.
He leído:
https://stackoverflow.com/questions/51656838/attribute-weak-and-static-libraries
y otros temas, pero parece que no hay respuesta a mi situación.
También he intentado:
- –whole_archive no ayudó
- Agregar todas las fuentes de hal_lib a platform_lib (y eliminar hal_lib por completo). No ayudó.
- Cambiar la posición de hal_portable_source.c.o en el comando de enlace. No ayudó.
- Lo mismo para la biblioteca.
davy.ai
Problema al enlazar la biblioteca HAL STM32 con referencias fuertes y débiles en el compilador ARM de IAR
Como experto en TI especializado en C, enlazadores, bibliotecas estáticas y referencias débiles, estoy intentando envolver la biblioteca de hardware “Biblioteca HAL STM32” en una biblioteca con mis adiciones y enlazarla a mi ejecutable usando el compilador ARM de IAR.
La estructura de la biblioteca involucra una plataforma con una biblioteca HAL que contiene hal_source.c con la función débil foo(), hal_portable_source.c con la función fuerte foo() y platform.c con la función fuerte foo(). El ejecutable se llama main.c.
En la estructura de CMake, Hal_Library.cmake tiene la biblioteca hal agregada con HAL_SOURCES, y Platform_Library.cmake incluye Hal_Library.cmake, agrega platform_lib con PLATFORM_SOURCES y enlaza platform_lib a hal_lib. Finalmente, CMakeLists.txt incluye la plataforma y agrega el ejecutable my_app con main.c enlazado a platform_lib.
hal_source.c contiene __weak void Foo(void) y lo llama en sus propias funciones. El proveedor asume que el usuario lo reemplazará con una implementación fuerte void Foo(void) en su código. Sin embargo, al intentar reemplazarlo en platform_lib con strong_foo_realization.c agregado y donde se enlaza hal_lib, __weak Foo() no es reemplazado por strong Foo().
He intentado utilizar –whole_archive, agregando todas las fuentes de hal_lib a platform_lib (y eliminando hal_lib), cambiando la posición de hal_portable_source.c.o en el comando de enlace, lo mismo para la biblioteca. Sin embargo, ninguna de estas soluciones funciona.
He leído varios temas y he probado múltiples soluciones, pero ninguna parece resolver mi problema.