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]) yNun 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