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.

Reemplace el símbolo débil agregando un archivo de objeto adicional.

Estoy escribiendo un firmware para un proyecto en el que quiero incluir información de depuración en el archivo de imagen actual, para que el controlador de errores en el firmware pueda producir una salida más detallada. El uso de información DWARF para esto no es una opción debido a restricciones de tamaño, pero haciendo algunas concesiones logré reducir la información requerida a un nivel aceptable (cómo exactamente no es relevante aquí, asuma un bloque binario). El problema ahora es: sólo puedo generar esa información de depuración una vez que haya producido una imagen de firmware vinculada, pero necesito agregar esa información al firmware para que sea accesible. Para esto, reservé dos símbolos débiles en el script del enlazador (PROVIDED a 0) en su propia sección (.dbgsym), si no se incluye información de depuración. Ahora estoy buscando una forma reproducible de volver a vincular la imagen del firmware para incluir la información adicional (disponible como un archivo de objeto compilado que contiene estos símbolos en la sección correcta), reemplazando los símbolos débiles por los símbolos reales proporcionados en este objeto adicional. Estoy usando GCC de la herramienta GNU ARM, pero soy flexible en cuanto a cómo se realiza exactamente este paso de post-procesamiento (siempre y cuando sea fácil de automatizar en un sistema de compilación).

Una opción que se me ocurrió es simplemente realizar nuevamente el paso de enlazado completo para la imagen, pero esto depende de que el enlazador sea determinista en el orden en que coloca los símbolos en la imagen final, en lo que preferiría no depender.

Como el enlazado ya utiliza un script del enlazador, sé que los datos adicionales deben ser agregados al final del archivo de imagen (desnudo) (además de actualizar los lugares donde se almacenan los punteros relevantes). Por lo tanto, podría simplemente agregar los datos adicionales y actualizar estos punteros en el binario. Si bien esto es ciertamente posible, esto requiere parchar manualmente la imagen del firmware donde el enlazador podría hacer perfectamente su trabajo.

Me pregunto cómo se hace esto en otros lugares, ya que agregar datos a un binario existente (pre-enlazado) no parece demasiado extraño o exótico.

PD: El formato de destino es ELF o una imagen binaria sin procesar, siendo ELF preferido.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como ya has reservado símbolos débiles en el script del enlazador, puedes usar la opción del enlazador -Wl,--undefined=<símbolo> para forzar al enlazador a resolver los símbolos débiles desde un nuevo archivo de objeto que contenga la información de depuración adicional. También puedes especificar la sección para los nuevos símbolos usando -Wl,--defsym=<símbolo>=<valor>.

    Aquí tienes un ejemplo de comando para enlazar la imagen de firmware con la nueva información de depuración:

    gcc main.o -o firmware.elf -Wl,-Tlinker_script.ld -Wl,--undefined=_debug_start -Wl,--undefined=_debug_end -Wl,--defsym=_debug_start=<valor> -Wl,--defsym=_debug_end=<valor> debug_info.o
    

    Este comando enlaza el archivo de objeto main.o para crear la imagen firmware.elf utilizando el script del enlazador linker_script.ld. También fuerza al enlazador a resolver los símbolos débiles _debug_start y _debug_end desde el archivo de objeto debug_info.o, y especifica sus valores en la sección .dbgsym usando la opción --defsym.

    Este paso de posprocesamiento puede automatizarse fácilmente en un sistema de compilación escribiendo un script que compile la información de depuración en un archivo de objeto y luego llame al comando del enlazador con las opciones correctas. La imagen resultante luego puede convertirse a un formato binario crudo usando objcopy.

    objcopy -O binary firmware.elf firmware.bin
    

    Para el formato ELF, puedes usar la opción -Wl,-Map=<nombre_archivo> para crear un archivo de mapa que muestre la disposición de memoria de la imagen final, lo cual puede ser útil para depurar y perfilar.</símbolo></símbolo>

Comments are closed.