Quiere saber sobre la utilidad objcopy
, que generalmente está disponible junto con GCC. Es un componente del paquete de herramientas binutils, cuyo miembro más visible es el enlazador, ld
.
El proceso consiste en que compila sus archivos de origen y los vincula generalmente como de costumbre. Eso le da un ejecutable terminado en formato elf (u otro binario reubicable dependiente de la plataforma). A continuación, usa objcopy para transformar el ejecutable en una imagen binaria plana.
Esto es más útil para preparar código para ejecutar desde ROM, donde debería asegurarse de estar utilizando una biblioteca de tiempo de ejecución de C adecuada para su plataforma de destino, y probablemente necesite personalizar el archivo de script del enlazador así como proporcionar su propio código de inicio de C runtime.
Si su objetivo es obtener algo similar a un archivo .so, para cargar en un proceso existente, tenga en cuenta que parte del trabajo del cargador de la biblioteca compartida es terminar de vincular realmente para que los símbolos en el archivo .so que hace referencia a las direcciones en el ejecutable principal (u otros archivos .so) se resuelven en el momento de la carga. El uso de objcopy no hará eso, por lo que podría ser difícil que las funciones cargadas de esta manera utilicen correctamente su biblioteca C runtime existente y los objetos que mantiene, como archivos abiertos.
Independientemente de tus objetivos, vas a tener que tomar el control del enlazador para ubicar tu binario en una dirección conocida. Para hacer eso, necesitarás crear un script enlazador. La documentación para el lenguaje de script está en the binutils manual. Usted estará interesado principalmente en las secciones ".text *" y posiblemente en las secciones ".rodata *" si planea tener variables globales inicializadas. En realidad, organizar esa inicialización se deja como un ejercicio para el lector.
En general, esto es solo la punta de un iceberg muy grande. Sugiero pasar algún tiempo con una compilación de compilación cruzada para ver cómo se usan estas cosas en la práctica. Las comunidades AVR y MSP430 utilizan GCC, tienen participación activa y hardware de bajo costo (y, a menudo, de código abierto) para comenzar.
¿no es esto lo que es un archivo objeto? – aaronasterling
no, como mínimo, los archivos de objeto contienen información sobre los símbolos que exportan (para el uso del vinculador) –
¿Alguna razón específica por la que no desea utilizar una biblioteca dll/compartida en su lugar? Hay muchos * escollos con binarios en bruto. – snemarch