2015-01-21 49 views
5

setjmp() là nghĩa vụ phải lưu sổ đăng ký bao gồm "địa chỉ trả về" và "con trỏ ngăn xếp" vào "jmp_buf". Khi tôi biên dịch (cả gcc và clang) và gỡ lỗi chương trình sau dưới x86_64 với glibc, tôi không thể hiểu được cái gì nằm trong "jmp_buf" và "địa chỉ trả về" và "con trỏ ngăn xếp" nằm trong "jmp_buf".Công cụ thực tế trong jmp_buf khi sử dụng setjmp và longjmp là gì?

#include <stdio.h> 
#include <setjmp.h> 

int main() 
{ 
    int i; 

    jmp_buf env; 

    i = setjmp(env); 

    printf("i = %d\n", i); 

    if (i != 0) return; 

    longjmp(env, 2); 
    printf("Does this line get printed?\n"); 
} 

Khi chương trình dừng tại điểm dừng trước "printf (" i =% d \ n ", i);", tôi đã thử chức năng gdb: "p/x env"; tuy nhiên tôi không thể tìm thấy "RIP trả về" và "RSP trước đó" trong cấu trúc này (env) chứa __jmpbuf và __saved_mask. Bất cứ ai biết chính xác hai chức năng này hoạt động như thế nào và chính xác những gì chúng tiết kiệm dưới x86_64 với glibc (tôi sử dụng ubuntu 14.04)?

+0

Tôi thấy một số câu hỏi như thế này trong stackoverflow.com, nhưng câu trả lời thường là "Nó phụ thuộc vào kiến ​​trúc, hệ điều hành, thư viện và ABI ..." hoặc dán tiêu chuẩn. Họ không phải là điều tôi muốn biết. – WindChaser

+1

Tại sao bạn không xem triển khai trên nền tảng của mình? Đó là mã nguồn mở. Ví dụ: https://github.com/lattera/glibc/blob/master/sysdeps/sh/____longjmp_chk.S - đó là những gì longjmp gọi vào trong glibc. –

Trả lời

7

Tin hay không, nội dung của jmp_bufcố ý vô nghĩa. Nếu bạn nhìn vào the source to the x86_64 setjmp(), bạn sẽ lưu ý một số tham chiếu đến PTR_MANGLE. Đây là một macro glibc nội bộ XORs một giá trị thread-local đối với một thanh ghi. Điều này được sử dụng ở đây phần lớn để đảm bảo rằng các nhà phát triển không dựa vào bố cục của jmpbuf - nó được coi là chi tiết triển khai và có thể thay đổi giữa các phiên bản của libc.

Nếu bạn muốn nội dung nào đó có thể đọc được, hãy xem the ucontext interface.

+2

Tôi tin rằng mangling con trỏ đã được giới thiệu như một tính năng bảo mật hơn là ẩn bố cục của jmpbuf. –

+0

@EmployedRussian Bạn có nghĩa là nó có thể ngăn chặn một số cuộc tấn công như ngăn xếp tràn? – WindChaser

+0

@WindChaser Đây là liên kết có liên quan duy nhất tôi có thể tìm thấy: http://udrepper.livejournal.com/13393.html –

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