2009-07-30 16 views
12

Tại sao điều này in rác thay vì thoát khỏi chương trình của tôi một cách duyên dáng? Tôi sử dụng các cuộc gọi hệ thống theo cách này trên BSD, và tôi tự hỏi tôi cần những gì để làm cho nó hoạt động trong Linux.Syscall từ nội tuyến asm trong x86_64 Linux?

int 
main(int argc, char **argv) 
{ 
    __asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */ 
    return 0; 
} 

Cảm ơn.

Trả lời

13

Tại sao rác in này thay vì thoát khỏi chương trình của tôi một cách duyên dáng?

Per CESA-2009-001, "Syscall 1 là thoát trên i386 nhưng viết trên x86_64".

những gì tôi cần phải làm cho nó hoạt trong Linux

Sử dụng ordinals syscall từ hiện tại unistd_64.h

Hope this helps!

+0

cảm ơn bạn! đây chính là nó. Tôi không biết tại sao họ phải thay đổi nó. Vì vậy, BSD sử dụng các số truyền thống trong khi Linux 64 đã thay đổi chúng. Điều này có nghĩa là tôi không thể sử dụng lại mã của mình mặc dù: ( – jbcreix

+1

@jbcreix, vì tò mò * tại sao * bạn sẽ làm điều này thay vì sử dụng các cuộc gọi di động 'exit()' và 'write()'? ? – RBerteig

+0

Các cuộc gọi di động cần liên kết với glibc hoặc các thư viện C. Cách này tôi chỉ có thể thực hiện các chức năng tôi cần theo cách tôi cần và độc lập với hệ điều hành. với mã GPL – jbcreix

3

Syscall 1 là lối ra trên i386 nhưng viết trên x86-64 Tôi tin tưởng.

CHỈNH SỬA: điều này có vẻ không chính xác: Theo web, dường như không có quá nhiều thông tin về lắp ráp x86-64 Linux, đây có vẻ là thiết lập đăng ký dự kiến ​​trước lệnh syscall.

rax system call number 
rbx arg0 
rcx return address from syscall 
rdx arg2 
rsi arg3 
rdi arg4 
r8 arg5 
r9 arg1 (expected by gcc in %rcx) 
r10-r15 should be saved/restored by C code 
rbp dito What is dito?? 
+1

Hmm, thông tin đăng ký này có sai không? Là rdi cho arg1 như OP cho thấy? –

+1

Có. Thứ tự là rdi, rsi, rdx, ... giống như trong các hàm thông thường với số syscall sẽ rax. Điều này có thể đúng với các phiên bản Linux x86_64 đầu tiên có thể sao chép i386 abi, nhưng tôi không biết chắc chắn. Dù sao trong trường hợp này một giá trị xấu cho arg1, vv không thể có thể gây ra vấn đề như lối ra sẽ luôn luôn thành công và chấm dứt quá trình. – jbcreix

+0

Có, tôi đã khá chắc chắn vấn đề chính là do nó sử dụng NR_write thay vì NR_exit, nhưng nghĩ rằng đối số có thể được tắt cũng! –

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