gdb breakpoint in shared libary



  • Hallo Zusammen,
    ich arbeite mich gerade in asm rein. Dafür habe ich ein einfaches helloworld programm in c geschrieben, und dieses anschließend disassembliert:

    1	#include <stdio.h>
    2	#include <string.h>
    3	
    4	int main(){
    5		char text[50];
    6		strcpy(text,"Hello World!");
    7		printf("%s\n",text);
    8		return 0;
    9	}
    

    disassembliert schaut das ganze so aus:

    0x000000000040059d <+0>:	push   rbp
       0x000000000040059e <+1>:	mov    rbp,rsp
       0x00000000004005a1 <+4>:	sub    rsp,0x40
       0x00000000004005a5 <+8>:	mov    rax,QWORD PTR fs:0x28
       0x00000000004005ae <+17>:	mov    QWORD PTR [rbp-0x8],rax
       0x00000000004005b2 <+21>:	xor    eax,eax
       0x00000000004005b4 <+23>:	lea    rax,[rbp-0x40]
       0x00000000004005b8 <+27>:	movabs rdx,0x6f57206f6c6c6548
       0x00000000004005c2 <+37>:	mov    QWORD PTR [rax],rdx
       0x00000000004005c5 <+40>:	mov    DWORD PTR [rax+0x8],0x21646c72
       0x00000000004005cc <+47>:	mov    BYTE PTR [rax+0xc],0x0
       0x00000000004005d0 <+51>:	lea    rax,[rbp-0x40]
       0x00000000004005d4 <+55>:	mov    rdi,rax
       0x00000000004005d7 <+58>:	call   0x400470 <puts@plt>
       0x00000000004005dc <+63>:	mov    eax,0x0
       0x00000000004005e1 <+68>:	mov    rcx,QWORD PTR [rbp-0x8]
       0x00000000004005e5 <+72>:	xor    rcx,QWORD PTR fs:0x28
       0x00000000004005ee <+81>:	je     0x4005f5 <main+88>
       0x00000000004005f0 <+83>:	call   0x400480 <__stack_chk_fail@plt>
       0x00000000004005f5 <+88>:	leave  
       0x00000000004005f6 <+89>:	ret
    

    wenn ich nun ein break in strcpy setzen möchte bekomme ich die ausgabe:
    Function "strcpy" not defined.
    Make breakpoint pending on future shared library load? (y or [n]) y

    Nun habe ich mich in google umgeschaut das einzige was ich herausgefunden habe ist, dass ich die libary's mit debuginformationen übersetzen muss, aber nicht wie.
    Zweitens ist mir aufgefallen, dass die strcpy garnicht aufgerufen wird sondern vom compiler anscheinend optimiert und stattdessen puts verwendet. Kann man die optimierungen von gcc in diesem fall nicht deaktivieren? Liegt es evt. daran, dass "break strcpy" nicht funktioniert?

    vielen Dank im voraus



  • Die Optimierung kannst Du in GCC mit dem Kommandozeilenparameter -O0 abschalten. Das wird Dir hier aber wenig bringen. Es gibt keinen Standard, der eine bestimmte Art der Kompilierung vorschreibt. Wenn GCC erkennt, dass ein strcpy (oder ein printf) völlig überflüssig ist und das Ergebnis schneller und einfacher anderswie zu erreichen ist, dann macht es das. Sehr ärgerlich im Mikrocontrollerbereich, wenn Verzögerungsschleifen einfach verschwinden.

    Wenn Du einen für GCC zur Kompilierzeit unbekannten Wert einbaust, dann muss der Compiler den umständlichen Weg wählen. Das geht z.B. mit Kommandozeilenparametern:

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        char text[50];
        strcpy(text,argv[0]);   // argv[0] ist der Programmname
        printf("%s\n",text);
        return 0;
    }
    

    Nun kann der Compiler strcpy nicht mehr einfach "wegoptimieren", da argv[0] zur Kompilierzeit nicht bekannt ist, und Du kannst den gewünschten Breakpoint setzen.

    viele grüße
    ralph



  • Hallo Ralph,
    danke für die Hilfe nun ist strcpy auch im assemblercode enthalten. Aber ich glaube es passt noch nicht ganz, den gdb findet die libc nicht. Wie kann ich diese einbinden?

    Reading symbols from ./hellow...done.
    (gdb) break main
    Haltepunkt 1 at 0x4005fc: file hellow.c, line 4.
    (gdb) break strcpy
    Haltepunkt 2 at 0x4004b0
    (gdb) line
    Undefined command: "line".  Try "help".
    (gdb) list
    1	#include <stdio.h>
    2	#include <string.h>
    3	
    4	int main(int argc, char *argv[]){
    5		char text[50];
    6		strcpy(text,argv[0]);
    7		printf("%s\n",text);
    8		return 0;
    9	}
    (gdb) break 7
    Haltepunkt 3 at 0x400621: file hellow.c, line 7.
    (gdb) run
    Starting program: /home/ahmet/hck/c/hellow 
    
    Breakpoint 1, main (argc=1, argv=0x7fffffffe108) at hellow.c:4
    4	int main(int argc, char *argv[]){
    (gdb) countinue
    Undefined command: "countinue".  Try "help".
    (gdb) continue
    Continuing.
    
    Breakpoint 2, __strcpy_sse2_unaligned ()
        at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:47
    47	../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: Datei oder Verzeichnis nicht gefunden.
    (gdb) disassemble main
    Dump of assembler code for function main:
       0x00000000004005ed <+0>:	push   rbp
       0x00000000004005ee <+1>:	mov    rbp,rsp
       0x00000000004005f1 <+4>:	sub    rsp,0x50
       0x00000000004005f5 <+8>:	mov    DWORD PTR [rbp-0x44],edi
       0x00000000004005f8 <+11>:	mov    QWORD PTR [rbp-0x50],rsi
       0x00000000004005fc <+15>:	mov    rax,QWORD PTR fs:0x28
       0x0000000000400605 <+24>:	mov    QWORD PTR [rbp-0x8],rax
       0x0000000000400609 <+28>:	xor    eax,eax
       0x000000000040060b <+30>:	mov    rax,QWORD PTR [rbp-0x50]
       0x000000000040060f <+34>:	mov    rdx,QWORD PTR [rax]
       0x0000000000400612 <+37>:	lea    rax,[rbp-0x40]
       0x0000000000400616 <+41>:	mov    rsi,rdx
       0x0000000000400619 <+44>:	mov    rdi,rax
       0x000000000040061c <+47>:	call   0x4004b0 <strcpy@plt>
       0x0000000000400621 <+52>:	lea    rax,[rbp-0x40]
       0x0000000000400625 <+56>:	mov    rdi,rax
       0x0000000000400628 <+59>:	call   0x4004c0 <puts@plt>
       0x000000000040062d <+64>:	mov    eax,0x0
       0x0000000000400632 <+69>:	mov    rcx,QWORD PTR [rbp-0x8]
       0x0000000000400636 <+73>:	xor    rcx,QWORD PTR fs:0x28
       0x000000000040063f <+82>:	je     0x400646 <main+89>
       0x0000000000400641 <+84>:	call   0x4004d0 <__stack_chk_fail@plt>
    ---Type <return> to continue, or q <return> to quit---
       0x0000000000400646 <+89>:	leave  
       0x0000000000400647 <+90>:	ret
    


  • Kakarott schrieb:

    Aber ich glaube es passt noch nicht ganz, den gdb findet die libc nicht.
    ...

    ...
        at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:47
    47	../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: Datei oder Verzeichnis nicht gefunden.
    ...
    

    Es handelt sich nur um eine Warnung. GDB hat die libc schon gefunden, nur deren Quelldateien nicht. Du kannst ohne Probleme weiter disassemblieren und debuggen. Du kannst die Quelldateien selbst herunterladen (z.B. mit ' apt-get source libc6 ' - http://stackoverflow.com/a/6481309) und anschauen. Den Pfad GDB bekannt zu machen habe ich nicht ausprobiert: http://stackoverflow.com/questions/13978692/strcpy-sse2-unaligned-s-not-found.

    Du solltest Dir angewöhnen, immer genaue Angaben zu Betriebssystem, verwendeten Programmen und Kommandozeilenbefehlen (mit Versionen) zu machen, wenn Du derart tief im System wurschtelst. Oft hängt die Antwort von jeder Kleinigkeit ab.

    viele grüße
    ralph



  • Alles klar, danke für die hilfreichen Tipps.

    mfg


Log in to reply