2015-12-23 19 views
7
[[email protected] bin]# ldd node 
     linux-vdso.so.1 => (0x00007fffd33f2000) 
     libdl.so.2 => /lib64/libdl.so.2 (0x00007f70f7855000) 
     librt.so.1 => /lib64/librt.so.1 (0x00007f70f764d000) 
     libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f70f7345000) 
     libm.so.6 => /lib64/libm.so.6 (0x00007f70f7043000) 
     libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f70f6e2d000) 
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f70f6c10000) 
     libc.so.6 => /lib64/libc.so.6 (0x00007f70f684f000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007f70f7a61000) 

Dòng đầu tiên và dòng cuối cùng có ý nghĩa gì? Chúng không giống như định dạng thông thườngCách diễn giải đầu ra của chương trình ldd?

xxxx.so => /lib64/xxxxx.so (0xxxxxxxxxxxxxxxxxxxx) 

.

+1

Bạn đã thử đọc trang người đàn ông của ldd? Nó cho bạn biết chính xác những gì nó làm. –

+0

Thôi nào các bạn, câu hỏi này không phải là “về phần cứng và phần mềm máy tính nói chung” nhưng rất nhiều công cụ liên quan trực tiếp đến việc lập trình ”. – 5gon12eder

+1

Tôi biết những gì nó làm, nhưng tôi không biết nơi tôi có thể tìm thấy linux-vdso.so.1 trong trường hợp của tôi (dòng đầu tiên), và tại sao không có mũi tên chỉ vào/lib64/ld-linux-x86-64. so.2 (dòng cuối cùng). –

Trả lời

3

ldd filename cho bạn thấy thư viện được chia sẻ của chương trình được tệp này sử dụng.

libc.so.6, ví dụ, là đối tượng chia sẻ libc phiên bản 6, nằm trong/lib64 và vị trí bộ nhớ của nó là 0x00007f70f684f000.

Dòng cuối cùng nói về ld-linux-x86-64.so phiên bản 2 trong/lib64. Đồng nghiệp này sẽ tìm và tải các thư viện được chia sẻ node nhu cầu. Nó sẽ chuẩn bị các thư viện đó và chạy chúng. Vì vậy, nói một cách thô lỗ, ld-linux-x86-64 là nhân vật. libc.so.6 và các tệp khác được tải và ldd hiển thị vị trí của các thư viện và vị trí bộ nhớ được chia sẻ đó. Đó là sự hiểu biết của tôi.

6

dòng đầu tiên là VDSO. điều này được mô tả chi tiết trong vdso(7) manpage. về cơ bản đó là một thư viện chia sẻ được nhúng vào hạt nhân của bạn và tự động được nạp bất cứ khi nào một quá trình mới là exec-ed. đó là lý do tại sao không có đường dẫn hệ thống tập tin ở bên phải - không có gì! các tập tin chỉ tồn tại trong bộ nhớ hạt nhân (tốt, không chính xác 100%, nhưng xem trang người đàn ông để biết thêm thông tin).

dòng cuối cùng là trình thông dịch ELF. điều này được mô tả ở độ sâu trong ld.so(8) manpage. lý do nó có đường dẫn đầy đủ là vì chương trình của bạn có đường dẫn đầy đủ được mã hóa trong đó. lý do nó không có mục nhập ở bên phải là nó không được liên kết với (trực tiếp) và do đó không có tìm kiếm nào được thực hiện. bạn có thể kiểm tra điều này bằng cách chạy:

$ readelf -l node | grep interpreter 
     [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 
$ scanelf -i node 
ET_EXEC /lib64/ld-linux-x86-64.so.2 node 

tất cả các dòng khác là thư viện bạn đã liên kết. bạn có thể thấy chúng bằng cách xem các thẻ DT_NEEDED khi bạn chạy readelf -d trên tệp. vì các tệp đó thiếu đường dẫn đầy đủ, nên ld.so cần thực hiện tìm kiếm đường dẫn động cho nó. đó là thực sự những gì các dòng đang nói với bạn: "libdl.so.2 là cần thiết, vì vậy khi tôi tìm kiếm nó, tôi tìm thấy nó tại /lib64/libdl.so.2 (và được tải vào bộ nhớ tại địa chỉ 0x00007f70f7855000)"

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