2011-10-25 28 views
5

Tôi muốn lập trình danh sách các thư viện được chia sẻ được liên kết bởi nhị phân của tôi trên Linux và Solaris. Ngay bây giờ tôi bao ra để pmap (Tôi không thể sử dụng ldd trên nhị phân vì nó sẽ không bao gồm các thư viện dlopen'd, và tôi không thể sử dụng pldd bởi vì nó chỉ là Solaris):Làm thế nào để có được danh sách thư viện chia sẻ thực thi từ C++?

std::ostringstream cmd; 
cmd << "/usr/bin/pmap " << getpid() << " | awk '{ print $NF }' | grep '\\.so' | sort -u"; 
FILE* p = popen(cmd.str().c_str(), "r"); 

Đây là một chút hackish nhưng nó hoạt động trên cả hai Solaris và Linux (đầu ra pmap là hơi khác nhau nhưng thông tin mong muốn là luôn luôn trong cột cuối cùng). Có cách nào để có được thông tin tương tự mà không bị bắn phá không? Điều đó hoạt động trên cả hai nền tảng? Tôi giả sử các tập tin /proc/$PID được định dạng khác nhau giữa chúng nhưng tôi không biết nơi các tiêu đề để giúp phân tích cú pháp những người thường nằm (nếu có một vị trí chung ở tất cả?).

+0

Nói đúng cách, các thư viện 'dlopen'ed không được "liên kết", chúng được tải khi chạy. Tôi giả sử bạn thực sự muốn có một danh sách của tất cả các thư viện được chia sẻ tải? –

+0

Đúng vậy. –

Trả lời

2

Bạn có thể sử dụng lệnh pmap 1234 với 1234 làm id quá trình.

Từ bên trong chương trình của bạn, cách đơn giản hơn (đặc trưng cho Linux) là đọc và phân tích cú pháp tệp /proc/self/maps.

Thử chạy

cat /proc/self/maps

dưới Linux: nó sẽ cho bạn thấy các bản đồ bộ nhớ của quá trình chạy lệnh cat trên.

Và nếu bạn có một số con trỏ chính xác, bạn có thể sử dụng dladdr (một chức năng cụ thể GNU/Linux hoặc Glibc) để nhận thông tin về thư viện động nào chứa nó.

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