2010-11-25 11 views
6

Tengo un archivo de objeto compilado usando como (del código del ensamblador).Detalles sobre queja de acceso de memoria gdb

Si vinculo usando ld, cuando intento stepi (o NexTi) GDB se queja de acceso a la memoria en la dirección 0x0. Si lo enlace usando gcc, todo está bien.

estoy adivinando el problema es causado por ld, lo que produce un menor número de secciones cuando se compara con el resultado de la vinculación gcc.

¿Hay alguna manera de configurar gdb para que sea más detallado para que pueda averiguar qué problema hay con el ejecutable?

(gdb) b main 
Breakpoint 1 at 0x100000f8e 
(gdb) r 
Breakpoint 1, 0x0000000100000f8e in main() 
(gdb) x/10i $pc 
0x100000f8e <main>: fbld 0x6c(%rip)  # 0x100001000 <data1> 
0x100000f94 <main+6>: fimul 0x7a(%rip)  # 0x100001014 <data2> 
0x100000f9a <main+12>: fbstp 0x60(%rip)  # 0x100001000 <data1> 
0x100000fa0 <main+18>: mov0x0 $0x2000001,%rax 
0x100000fa7 <main+25>: mov $,%rdi 
0x100000fae <main+32>: syscall 
(gdb) si 
Cannot access memory at address 0x0 
0x0000000100000f94 in main() 

PS: El ejecutable en sí funciona como se espera en ambas versiones.

editar posteriores: los comandos que he usado para compilar:

as -arch x86_64 src.s -o src.o 
ld -e _main -arch x86_64 src.o -o src 
gcc -o src src.o 
+0

¿Ha intentado vaciar los registros (registros de información) o la pila antes y, si es diferente, después del comando "stepi"? ¿Por qué te importa si el ejecutable funciona bien? – AlastairG

+0

Puedo volcar los registros antes y después del "stepi" pero no veo nada relevante. Me importa porque no me gusta el comportamiento inexplicable. – diciu

+0

¿Cómo llamas 'ld' y 'gcc' (y 'como' por supuesto)? ¿Qué banderas usaste? – Bart

Respuesta

2

BGF tiene un "programa de depuración" de comandos, dando varias configuraciones de depuración internas. P.ej. "establecer el objetivo de depuración 1" activará el rastreo de la interacción de gdb con el proceso objetivo. Es posible que desee experimentar con cada bandera que tienen (no hay tantas).

+0

gracias por la respuesta. Ahora veo el problema: una llamada a frame_register_unwind en el binario creado por ld devuelve 0x0. No tengo idea de por qué, pero es un buen comienzo. – diciu

1

GCC en realidad no realiza los enlaces, solo llama a ld en su nombre. Las opciones que proporciona deben ser diferentes de las que está utilizando.

por este tema:

How to get GCC linker command?

Usted debe ser capaz de ver la línea de comandos de la invocación ld -v gcc ejecutando. Eso debería indicarle cómo modificar su línea de comando ld para que las cosas funcionen para usted.

+0

gracias por la respuesta, de hecho puedo vincular usando ld con los argumentos adicionales reunidos de esta manera. – diciu

Cuestiones relacionadas