romuald que name keywords etiquetas description content shared-libraries arm dynamic-data relocation bare-metal

shared-libraries - name - que es meta description en wordpress



Cómo escribir un cargador dinámico para la aplicación de brazo desnudo (1)

Estoy trabajando en un proyecto basado en el procesador arm9. Solo usamos bare-metal sin ningún sistema operativo, por lo que desafortunadamente todavía no tenemos soporte para bibliotecas compartidas / cargador dinámico.

Me gustaría tener bibliotecas cargadas, por ejemplo, desde la tarjeta SD, que también puede llamar a las funciones desde la aplicación principal.

Mi primer intento fue usar la capacidad de superposición del enlazador (colocando la biblioteca en secciones específicas y absolutamente posicionadas), pero aquí hay un problema al llamar a las funciones principales de la aplicación como mencioné antes -> con cada cambio de la aplicación principal, las librerías deben volver a compilarse para poder devolver la llamada.

De acuerdo con esto, tendré que escribir mi propio cargador dinámico, pero soy novato en esta área. ¿Podría alguien darme algún ejemplo de cómo manejarlo o cómo comenzar con ese proyecto? Estamos utilizando gcc para el objetivo del brazo-elf.

saludos Jan


Verifique esta nota de aplicación . Describe en algunos detalles cómo funciona el enlace dinámico y lo que necesita hacer para escribir su propio cargador dinámico. También da algunas alternativas a eso. Creo que las tablas de salto uno es bastante fácil de implementar y resolverá su problema cambiando las direcciones de API.

Editar : He aquí cómo hacer una tabla de salto simple. Primero, decida qué funciones necesita exportar de su programa principal. Luego crea una estructura de indicadores de función:

typedef struct _MyAPI { int (*init)(int flags); int (*exit)(int exitcode); void * (*getmem)(size_t size); void (*freemem)(void *ptr); } MyAPI;

En el programa principal, defina una instancia de esta estructura, complete los punteros y colóquela en una dirección predefinida:

#include <jumptbl.h> int main_init(int flags) { return 0; } //... MyAPI main_API __attribute__((section(".jumptbl"))) = { &main_init, &main_exit, &main_getmem, &main_freemem, };

(Si usa este enfoque, deberá describir la sección .jumptbl en el archivo del enlazador y asegurarse de que obtenga una dirección fija)

En el módulo cargado, obtenga el puntero a la tabla de salto y utilícela para llamar al programa principal:

#include <jumptbl.h> MyAPI *pAPI = (MyAPI*)(0x1000000); // there should be a better way to do this int main() { pAPI->init(0); void *block = pAPI->getmem(0x30); //... }

¡Espero que esto ayude!