2017-06-12 42 views
7

Tôi muốn có thể viết và gỡ lỗi lắp ráp x64 trên máy Mac của tôi với Sierra 10.12.4. Người ta sẽ nghĩ rằng điều này sẽ không phải là một mong muốn đặc biệt khó khăn hoặc mơ hồ, nhưng mặc dù nhiều giờ nỗ lực và rất nhiều tìm kiếm trực tuyến tôi đã không thành công và tôi đã không tìm thấy bất cứ ai khác có một trong hai.Có thể gỡ lỗi lắp ráp x64 trên Mac OS không?

Tôi muốn sử dụng trình kết hợp NASM, nhưng sẽ sử dụng GAS hoặc bất kỳ thứ gì với cú pháp của Intel nếu tôi có. (Bằng cách này, lưu ý rằng cả gdb và LLĐB làm việc tốt với các tập tin C biên dịch với gcc.)

Dưới đây là hoàn cảnh của tôi và những gì tôi đã cố gắng:

NASM không hoạt động

Tôi có thể lắp ráp và liên kết một tập tin và xác minh nó hoạt động.

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

Nhưng tôi không thể gỡ lỗi nó với gdb (lưu ý rằng tôi đã làm tất cả những codesigning vô nghĩa cần thiết):

$ 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. 

Và tôi không thể gỡ lỗi nó với LLĐB:

$ 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 không hoạt động

tôi có thể lắp ráp, liên kết, và chạy:

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

Nhưng tôi không thể gỡ lỗi với 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] 

(. Vì vậy, nó chỉ chạy và bỏ breakpoint)

Và tôi không thể gỡ lỗi nó với LLĐB:

$ 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. 

Điều tôi đã tìm thấy trực tuyến

Here là một bài đăng trên blog về gdb không hoạt động trên các phiên bản mới của Mac OS.

Có một vài câu hỏi StackOverflow có liên quan cũ, không cung cấp câu trả lời thích hợp.

Ngoài ra còn có this way to use Xcode, có vẻ kỳ diệu để hoạt động ... nhưng nó không thực sự làm những gì tôi muốn. Trình gỡ lỗi không thực sự nhận biết được tệp nguồn của tôi; nó chỉ là bước qua các hướng dẫn và hiển thị mã tháo rời hoặc một cái gì đó. Ngoài ra tôi không muốn sử dụng XCode.

Tôi đã hỏi về điều này trong danh sách gửi thư NASM cách đây vài tháng và không ai trả lời.

Vậy ...

Vậy là nó hiện không thể làm một trong những điều cơ bản nhất mà một người có thể muốn làm gì với một máy tính sử dụng máy Mac?

Nếu ai đó có cách để thực hiện việc này, vui lòng chỉ cho tôi chính xác các lệnh cần thiết.

+0

Phiên bản 'nasm' nào? Phiên bản 'gdb',' llvm' là gì? –

+0

Tôi đã thử các phiên bản nasm 2.13.01 và 2.14rc0, và các phiên bản gdb 7.12.1 và 8.0. lldb-370.0.42. Apple llvm phiên bản 8.1.0. Tôi nhận được kết quả tương tự bất kể phiên bản. Bạn có ngụ ý bạn đã nhận được gỡ lỗi để làm việc với một số phiên bản của phần mềm này? –

+0

Tôi đang đề cập đến chú thích phát hành 2.13: "Định dạng đối tượng macho giờ đây hỗ trợ định dạng gỡ lỗi lùn, theo yêu cầu của các toolchains mới hơn". nhưng bạn đã cho biết bạn đang ở gần nhất. Bạn đã hỏi trên diễn đàn co thắt? –

Trả lời

1

Miracle của phép lạ, có vẻ như tôi có thể làm điều này với kêu vang:

$ 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 

Thật không may như xa như tôi có thể nói hỗ trợ lắp ráp x64 kêu vang là hoàn toàn không có giấy tờ, và tôi đã tìm ra câu thần chú chính xác để làm chỉ này bằng cách thử nghiệm. Nhưng tôi đoán vậy.

+0

Tôi không biết nơi tìm tài liệu cho trình kết hợp clang, nhưng Xcode có tùy chọn hiển thị nguồn lắp ráp llvm cho một Tệp nguồn C/C++/ObjC (Product-> Perform Action-> Assemble). Điều đó có thể cho phép bạn để có được ví dụ về các hoạt động tương tự mà bạn có thể nôi cho các mục đích của bạn. –

Các vấn đề liên quan