No se pueden insertar puntos de interrupción. Dirección con valores bajos

Estoy tratando de depurar este sencillo programa en C:

#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("Hello\n");
}

Pero cuando desarmo la función principal me sale esto:

(gdb) disas main
Dump of assembler code for function main:
    0x000000000000063a <+0>:    push   rbp
    0x000000000000063b <+1>:    mov    rbp,rsp
    0x000000000000063e <+4>:    sub    rsp,0x10
    0x0000000000000642 <+8>:    mov    DWORD PTR [rbp-0x4],edi
    0x0000000000000645 <+11>:   mov    QWORD PTR [rbp-0x10],rsi
    0x0000000000000649 <+15>:   lea    rdi,[rip+0x94]        # 0x6e4
    0x0000000000000650 <+22>:   call   0x510 <puts@plt>
    0x0000000000000655 <+27>:   mov    eax,0x0
    0x000000000000065a <+32>:   leave  
    0x000000000000065b <+33>:   ret    
End of assembler dump.

Y esto ya es bastante extraño porque las direcciones comienzan con un prefijo de 4 ... para ejecutables de 32 bits y 8 ... para ejecutables de 64 bits, creo.

Pero pasando, entonces pongo un punto de interrupción:

(gdb) b *0x0000000000000650
Breakpoint 1 at 0x650

Lo ejecuto y recibo este mensaje de error:

Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x650

Respuestas a la pregunta(1)

Su respuesta a la pregunta