es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.
Tags:  , , ,

Answer

  1. Avatar for 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.

Comments are closed.