2011-05-13 20 views
12

Sin tener que buscar en la fuente de GDB, ¿dónde puedo encontrar documentación sobre el formato utilizado para crear archivos de núcleo?Formato de archivo de núcleo ELF

La especificación ELF deja el formato de archivo central abierto, así que supongo que esto debería ser parte de las especificaciones de GDB. Tristemente, no encontré ninguna ayuda en este sentido de la documentación gdb de GNU.

Esto es lo que trato de hacer: Asignar direcciones virtuales a nombres de funciones en ejecutables/bibliotecas que comprenden el proceso en ejecución. Para hacer eso, primero me gustaría averiguar, desde el archivo central, el mapa desde el espacio de direcciones virtuales hasta el nombre del archivo/bibliotecas ejecutables, y luego profundizar en el archivo relevante para obtener la información simbólica.

Ahora 'readelf -a core' me dice que casi todos los segmentos del archivo central son del tipo 'cargar' - supongo que estos son los segmentos .text y .bss/.data de todos archivos participantes, más un segmento de pila. A excepción de estos segmentos de carga, hay un segmento de nota, pero eso no parece contener el mapa. Entonces, ¿cómo es la información sobre qué archivo corresponde a un segmento, almacenado en el archivo central? ¿Están esos segmentos de 'carga' formateados de una manera particular para incluir la información del archivo?

+0

Nos puedes contar un poco de lo que entendemos por 'formato de archivo core'? ¿Se refiere al formato de código de objeto que produce gcc o al formato del ejecutable final, en cuyo caso sería ELF o algo más? – greatwolf

+1

Una respuesta más reciente para esta pregunta es [aquí] (http://stackoverflow.com/a/38427225/5058676). – evaitl

Respuesta

2

No tanto gdb como la biblioteca bfd utilizado por gdb, binutils, etc.

3

un volcado de memoria es la imagen en memoria del proceso cuando se estrelló. Incluye los segmentos del programa, la pila, el montón y otros datos. Todavía necesitará el programa original para dar sentido a los contenidos: las tablas de símbolos y otros datos hacen que las direcciones y estructuras sin formato en la imagen de la memoria sean significativas.

2

Se almacena información adicional sobre el proceso que generó el archivo central en una sección de notas ELF, aunque de forma específica para el sistema operativo. Por ejemplo, vea core(5) manual page para NetBSD.

2

Una solución más simple a su problema puede ser analizar texto de/proc/$ pid/maps para determinar a qué archivo se asigna una dirección virtual determinada. Luego puede analizar el archivo correspondiente.

El VDB (depurador) de código abierto de Kenshoto utiliza este enfoque, si puede leer Python, es un buen ejemplo.

6

El formato del archivo de volcado del núcleo está utilizando el formato ELF, pero no se describe en el estándar ELF. AFAIK, no hay referencia autorizada sobre esto.

Entonces, ¿cómo es la información sobre qué archivo corresponde a un segmento, almacenado en el archivo central?

Mucha información adicional está contenida en las notas ELF. Puede usar readelf -n para verlos.

La nota CORE/NT_FILE define la asociación entre el rango de direcciones de memoria y el archivo (+ offset):

Page size: 1 
      Start     End   Page Offset 
0x0000000000400000 0x000000000049d000 0x0000000000000000 
    /usr/bin/xchat 
0x000000000069c000 0x00000000006a0000 0x000000000009c000 
    /usr/bin/xchat 
0x00007f2490885000 0x00007f24908a1000 0x0000000000000000 
    /usr/share/icons/gnome/icon-theme.cache 
0x00007f24908a1000 0x00007f24908bd000 0x0000000000000000 
    /usr/share/icons/gnome/icon-theme.cache 
0x00007f24908bd000 0x00007f2490eb0000 0x0000000000000000 
    /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf 
[...] 

Para cada hilo, usted debe tener una nota CORE/NT_PRSTATUS que le da los registros de la rosca (incluyendo el puntero de pila). Es posible que pueda inferir la posición de las pilas a partir de esto.

Más información sobre el formato de los archivos del núcleo ELF:

Cuestiones relacionadas