2017-06-12 38 views
7

Chciałbym móc pisać i debugować zestaw x64 na moim Macu z Sierra 10.12.4. Można by pomyśleć, że nie byłoby to szczególnie trudne lub niejasne pragnienie, ale pomimo wielu godzin wysiłku i wielu poszukiwań w Internecie, nie udało mi się i nie znalazłem nikogo innego, kto je posiada.Czy można debugować zestaw x64 w systemie Mac OS?

Wolałbym używać asemblera NASM, ale jeśli będę musiał, użyję GAS lub cokolwiek ze składnią Intela. (Nawiasem mówiąc, należy pamiętać, że zarówno gdb i lldb praca grzywny z plików C skompilowane z gcc.)

Oto moja sytuacja i czego próbowałem:

NASM nie działa

Mogę złożyć i połączyć plik i sprawdzić, czy działa.

$ nasm -f macho64 -g -F dwarf hello2.s -o hello2.o 
$ gcc hello2.o -o hello2 
$ ./hello2 
Hello, world! 

Ale nie mogę go debugować z gdb (Zauważ, że zrobiła wszystko codeSigning niezbędne nonsens):

$ gdb hello2 
GNU gdb (GDB) 8.0 
<snip> 
Reading symbols from hello2...done. 
(gdb) list 
1 section .data 
2 
3 msg: db "Hello, world!", 0 
4 
5 section .text 
6  global _main 
7  extern _puts 
8 
9 _main: 
10  push rbp 
(gdb) break 10 
Breakpoint 1 at 0x0: file hello2.s, line 10. 
(gdb) run 
Starting program: /Users/mike/GoogleDrive/Projects/Sort/hello2 
[New Thread 0x1403 of process 38022] 
warning: unhandled dyld version (15) 
Warning: 
Cannot insert breakpoint 1. 
Cannot access memory at address 0x0 

Command aborted. 

I nie można debugować go lldb:

$ lldb hello2 
(lldb) target create "hello2" 
Current executable set to 'hello2' (x86_64). 
(lldb) b hello2.s:10 
Breakpoint 1: no locations (pending). 
WARNING: Unable to resolve breakpoint to any actual locations. 

GAS nie działa

mogę zmontować, link, i uruchom:

$ gcc -g hello.s -o hello 
$ ./hello 
Hello, world! 

Ale nie mogę debugować z gdb:

$ gdb hello 
GNU gdb (GDB) 8.0 
<snip> 
Reading symbols from hello...Reading symbols from /Users/mike/GoogleDrive/Projects/Sort/hello.dSYM/Contents/Resources/DWARF/hello...done. 
done. 
(gdb) list 
1 .intel_syntax 
2 .text 
3  .globl _main 
4 
5 _main: 
6  push rbp 
7  mov rbp, rsp 
8  lea rdi, [rip + _main.S_0] 
9  call _puts 
10  mov rax, 0 
(gdb) break 6 
No line 6 in the current file. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (6) pending. 
(gdb) run 
Starting program: /Users/mike/GoogleDrive/Projects/Sort/hello 
[New Thread 0x1403 of process 38063] 
warning: unhandled dyld version (15) 
Hello, world! 
[Inferior 1 (process 38063) exited normally] 

(. Więc po prostu zabrakło i zignorował przerwania)

I nie można debugować go lldb:

$ lldb hello 
(lldb) target create "hello" 
Current executable set to 'hello' (x86_64). 
(lldb) b hello.s:6 
Breakpoint 1: no locations (pending). 
WARNING: Unable to resolve breakpoint to any actual locations. 

Rzeczy, które znalazłem online

Here to blog o numerze gdb nie działający w nowych wersjach systemu Mac OS.

Istnieje kilka starych powiązanych pytań dotyczących StackOverflow, z których żadne nie stanowią odpowiedniej odpowiedzi.

Istnieje również this way to use Xcode, który cudownie wydaje się działać ... ale tak naprawdę nie robi tego, co chcę. Debugger faktycznie nie jest świadomy mojego pliku źródłowego; chodzi tylko o przejrzenie instrukcji i wyświetlenie zdemontowanego kodu lub czegoś podobnego. Również nie chcę używać XCode.

Zapytałem o to na liście mailingowej NASM kilka miesięcy temu i nikt nigdy nie odpowiedział.

Więc ...

Więc jest to obecnie niemożliwe do zrobienia jedną z najbardziej podstawowych rzeczy osoba może chcą zrobić z komputerem przy użyciu komputera Mac?

Jeśli ktoś ma sposób, aby to zrobić, pokaż mi dokładnie niezbędne polecenia.

+0

Jaką wersję 'nasm'? Jaka wersja 'gdb',' llvm'? –

+0

Próbowałem już wersje nasm 2.13.01 i 2.14rc0 oraz wersje gdb 7.12.1 i 8.0. lldb-370,0.42. Apple llvm wersja 8.1.0. Otrzymuję te same wyniki niezależnie od wersji. Czy sugerujesz, że masz debugowanie, aby pracować z jakąś wersją tego oprogramowania? –

+0

Mam na myśli informację o wydaniu nasm 2.13: "Format obiektu macho obsługuje teraz format debugowania karłów, zgodnie z nowszymi wersjami narzędzi." ale wskazałeś, że jesteś na bieżąco. Czy zapytałeś na forum Nasm? –

Odpowiedz

1

Cud nad cudami, jak się wydaje, można zrobić to z brzękiem:

$ clang -g -c -x assembler hello.s 
$ clang hello.o -o hello 
$ ./hello 
Hello, world! 
$ lldb hello 
(lldb) target create "hello" 
Current executable set to 'hello' (x86_64). 
(lldb) b hello.s:10 
Breakpoint 1: where = hello`main + 16, address = 0x0000000100000f7c 
(lldb) run 
Process 40460 launched: '/Users/mike/GoogleDrive/Projects/Sort/hello' (x86_64) 
Hello, world! 
Process 40460 stopped 
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 
    frame #0: 0x0000000100000f7c hello`main at hello.s:10 
    7  mov rbp, rsp 
    8  lea rdi, [rip + _main.S_0] 
    9  call _puts 
-> 10  mov rax, 0 
    11  mov rsp, rbp 
    12  pop rbp 
    13  ret 

Niestety o ile mogę powiedzieć wsparcie montaż 64 dzyń jest całkowicie nieudokumentowane, a ja zorientowali się odpowiednie zaklęcia to zrobić tylko przez eksperymentowanie. Ale to chyba coś.

+0

Nie wiem, gdzie znaleźć dokumentację dla asemblera, ale Xcode ma opcję wyświetlenia źródła montażu llvm dla Plik źródłowy C/C++/ObjC (Product-> Perform Action-> Assemble). To może pozwolić ci uzyskać przykłady podobnych operacji, które możesz przystosować do swoich celów. –