2013-08-21 39 views
10

Ai đó có thể giải thích cho tôi đầu ra của lệnh ldd không? Trong ví dụ sau (trên hệ thống Gentoo)Giải thích về đầu ra ldd

$ ldd /bin/date 
    linux-vdso.so.1 => (0x00007fff6ffff000) 
    librt.so.1 => /lib64/librt.so.1 (0x00007f54ba710000) 
    libc.so.6 => /lib64/libc.so.6 (0x00007f54ba384000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f54ba167000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f54ba919000) 

dòng đầu tiên có nghĩa là gì? "Linux-vdso.so.1 => (0x00007fff6ffff000)" The => không trỏ đến bất kỳ tệp thư viện được chia sẻ nào.

+0

bản sao có thể có của [Hiểu đầu ra ldd] (http://stackoverflow.com/questions/5554343/understanding-ldd-output) –

Trả lời

12

Phần quan trọng nhất của đầu ra đó là linux-vdso. VDSO là viết tắt của Virtual Dynamic Shared Object - đó là một cách để xuất thủ tục không gian hạt nhân vào không gian người dùng. Lý do chính là giảm chi phí cuộc gọi hệ thống. Thông thường khi một cuộc gọi hệ thống xảy ra, nó đòi hỏi một số hoạt động đắt tiền như chuyển đổi chế độ từ người dùng sang hạt nhân, sao chép dữ liệu từ không gian người dùng sang kernelspace vv Để giảm các loại VDSO trên được sử dụng, chỉ cần đọc kết quả không gian bộ nhớ vdso. có thể để gettimeofday() mà không thực hiện một cuộc gọi hệ thống thực sự! Lưu ý, không phải tất cả các cuộc gọi hệ thống đều có hỗ trợ VDSO, chỉ có các cuộc gọi hệ thống như getcpu(), gettimeofday(), time(), vv là một cách cực kỳ nhanh chóng để hoàn thành công việc này. Ngoài ra các địa chỉ bộ nhớ linux-vdso.so.1 điểm được phân ngẫu nhiên, trên lời gọi ldd khác nhau, bạn sẽ thấy các điểm linux-vdso.so.1 đến vị trí bộ nhớ khác nhau. Điều này đã được thực hiện như thể không ai có thể dự đoán địa chỉ lên phía trước.