2010-10-01 19 views
6

Mis proyectos integrados tienen un paso posterior al proceso que reemplaza un valor en el ejecutable con el CRC de (algunas secciones de) el flash. Este paso solo se puede realizar después del enlace, ya que es la primera oportunidad para CRC la imagen. En el pasado, el formato de archivo era COFF, y he creado una herramienta personalizada para realizar el parche.¿Herramienta para la modificación simple del archivo elf?

La herramienta de desarrollo se ha cambiado a ELF, por lo que necesito volver a implementar el parche CRC. Antes de hacerlo, pensé que buscaría una herramienta existente para hacer esto. El compilador se basa en gcc, pero no puedo ver ninguna combinación de ld y nm y readelf que pueda hacer el trabajo. Una búsqueda en Google no ha sido fructífera.

Mi herramienta actual usa nm para encontrar la dirección a parchar, y llama al parcheador con la dirección, el valor esperado (para evitar sobrescribir los datos incorrectos) y el nuevo valor CRC. El CRC se calcula en un formato "hexadecimal" del ejecutable (que también parche), así que afortunadamente no tengo que volver a hacer esa parte.

Puedo implementar esto con libelf y código personalizado de nuevo, pero antes de hacerlo, ¿ya existe?

¿Hay alguna forma mejor de lograr mi objetivo de colocar un CRC del ejecutable en el ejecutable para que esté disponible para la aplicación?

Respuesta

4

Si he entendido lo que estás tratando de hacer correctamente, creo que el siguiente funcionaría:

  • nm le da la dirección virtual en tiempo de ejecución de la ubicación que desea aplicar un parche;
  • readelf -S le brinda tanto la dirección virtual de tiempo de ejecución como el desplazamiento dentro del archivo para el comienzo de cada sección;
  • uniendo los dos juntos (por ejemplo, con algunas líneas de su lenguaje de scripting favorito) da la compensación dentro del archivo para parchar.
+0

Esta es una gran sugerencia, +1. Lo probaré. –

0

No estoy seguro de si esto funcionaría, pero es posible que pueda organizarlo para que la ubicación CRC dentro de su archivo de objeto se establezca en la dirección de un símbolo externo X. Ese símbolo externo podría entonces ser satisfecho por un último paso de enlace al enlazar en un archivo elf que no hizo nada más que especificar que la dirección X era la CRC que usted ha calculado.

Esto sigue siendo bastante hacky, y no estoy seguro de si es fácilmente posible (ya que es un abuso de las herramientas).

+0

Sí, no he descubierto cómo hacer esto, ya que el enlace no se completará con símbolos faltantes, y necesito el enlace para poder calcular el CRC. –

+0

Estaba pensando que esto podría no ser un problema, pero parece que incluso cuando vuelve a vincular un ejecutable incorporado (todas las dependencias se encontraron con ese archivo de archivo) ese 'ld' se reorganiza y rompe cosas. Hay varios programas para meter números de serie en imágenes de firmware. Tal vez haya una para las imágenes de los elfos que puedas reutilizar para esto. – nategoose

Cuestiones relacionadas