2008-10-14 7 views
6

¿Cómo se obtiene un puntero a la sección de texto de la memoria para un programa dentro de ese programa? También necesito la longitud de la sección para hacer una comparación de "Memoria Flash" como parte de una autoprueba continua que se ejecuta en segundo plano.¿Cómo se obtiene un puntero a la sección .text?

El conjunto de herramientas genera automáticamente el archivo .cmd del vinculador para las herramientas que estoy usando, y el Paquete de soporte de la Junta para la placa que estoy usando requiere que use el archivo .cmd generado en lugar de crear el mío. (No crea archivo para agregar una secuencia de comandos para ensuciar con las palabras posteriores.)

Edit: Estoy trabajando con un DSP de TMS 6713 usando el entorno de compositor de código 3.1. La tarjeta que estoy usando fue contratada por nuestro cliente y producida por otra organización, por lo que no puedo señalarle ninguna información al respecto. Sin embargo, el BSP depende de la herramienta de configuración "DSP BIOS" de TI, y realmente no puedo fudgear mucho la configuración sin tener que esforzarme para alcanzar el alcance.

Respuesta

4

Debe colocar "variables" en el script del enlazador.

En uno de mis proyectos que tengo esto en una de mis secciones:

__FlashStart = .; 

En el programa de C tengo esto:

extern unsigned long int _FlashStart; 
unsigned long int address = (unsigned long int)&_FlashStart; 
4

Definitivamente sería más fácil si se puede modificar el secuencia de comandos del enlazador Como no puede, es posible extraer nombres de sección, direcciones y tamaños del programa binario. Por ejemplo, aquí es cómo uno usaría libbfd para examinar todas las secciones de códigos.

#include <bfd.h> 

bfd *abfd; 
asection *p; 
char *filename = "/path/to/my/file"; 

if ((abfd = bfd_openr(filename, NULL)) == NULL) { 
    /* ... error handling */ 
} 

if (!bfd_check_format (abfd, bfd_object)) { 
    /* ... error handling */ 
} 

for (p = abfd->sections; p != NULL; p = p->next) { 
    bfd_vma base_addr = bfd_section_vma(abfd, p); 
    bfd_size_type size = bfd_section_size (abfd, p); 
    const char *name = bfd_section_name(abfd, p); 
    flagword  flags = bfd_get_section_flags(abfd, p); 

    if (flags & SEC_CODE) { 
     printf("%s: addr=%p size=%d\n", name, base_addr, size); 
    } 
} 

Si solo desea ver el segmento .text, usted podría oponerse al nombre de la sección.

¿El inconveniente de este enfoque? Libbfd tiene licencia bajo la GPL, por lo que todo su proyecto estaría gravado con la GPL. Para un proyecto comercial, esto podría no ser un comienzo.

Si su binario está en formato ELF, podría usar libelf en su lugar. No estoy familiarizado con el funcionamiento de las API de Libelf, por lo que no puedo proporcionar un código de muestra. El Linux libelf también es GPL, pero creo que los proyectos BSD tienen su propio código que puedes usar.

Edición: Como está trabajando en un DSP en un entorno de OS mínimo en tiempo real, esta respuesta no va a funcionar. Lo siento, lo intenté.

1

Podría aclarar cuales cadena de herramientas y la arquitectura le interesa.

En el compilador que estoy usando en este momento (IAR BRAZO C/C++) hay operadores integrados en el compilador que devuelvan el segmento comienzan dirección __sfb(...) , el segmento de dirección de fin __sfe(...), y el tamaño del segmento __sfs(...)

1

los símbolos que buscas son __text__ y __etext__ que señalan el comienzo y el final de la sección .text, respectivamente.

Puede encontrar útil el archivo generado .map, ya que enumera todos los símbolos y secciones definidos en su aplicación.

Cuestiones relacionadas