Có cách nào để xác định gói hoặc thư viện nào sẽ được tải để hỗ trợ thực thi không?


11

Có một tệp thực thi mà tôi muốn cài đặt trên máy tính mà tôi không thể biên dịch lại được mà không được xây dựng dưới dạng gói và tôi muốn tải xuống các thư viện mà nó yêu cầu để chạy chúng.

Dưới đây là một phần của đầu ra từ việc chạy lddtrên nó

libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)

Có công cụ nào có thể sử dụng thông tin này để chọn gói nào nên được tải xuống hoặc tốt hơn là chỉ trích xuất các thư viện được liệt kê và phần phụ thuộc của chúng, để giảm thiểu việc sử dụng đĩa không? Hệ thống đang chạy trên máy ảo không đầu và chương trình sẽ được hiển thị qua VNC.

Mặc dù tôi nghi ngờ rằng một máy tính để bàn đồ họa đầy đủ sẽ cung cấp hầu hết các thư viện cần thiết, tôi chỉ muốn tải xuống các thư viện cần thiết, phụ thuộc của chúng và chỉ đủ gói X Windows để hỗ trợ.


1
HĐH gì? Các gói và tên của chúng cũng như trình quản lý gói thay đổi giữa các bản phân phối (và điều này giả sử bạn đang chạy một loại Linux nào đó).
terdon

Đó là Debian và Ubuntu trong trường hợp này
vfclists

Trong trường hợp đó, câu trả lời của tôi sẽ làm việc cho bạn.
terdon

Trong thực tế, tôi chỉ muốn kiểm tra nó, muộn màng. Tôi hoàn toàn quên nó và chỉ hỏi một câu hỏi tương tự khiến câu hỏi này hiển thị là câu hỏi liên quan hàng đầu, LOL
vfclists

Câu trả lời:


14

Bạn chưa nói bạn đang sử dụng HĐH nào nên tôi sẽ giả sử Linux và sẽ sử dụng Debian làm ví dụ. Câu trả lời nhanh cho câu hỏi của bạn không xa như tôi biết. Đây có thể là một cách giải quyết hữu ích:

ldd your_prog | awk '{print $1}' | sed 's/\..*//' | 
  while read n; do echo "----- $n ----"; apt-cache search ^$n; done

Điều này sẽ phân tích cú pháp ldd đầu ra và sau đó chạy apt-cache(thay thế bằng hệ điều hành tương đương với hệ điều hành của bạn) để tìm kiếm kho lưu trữ cho các gói có tên và mô tả chứa phần đầu tiên của tên thư viện được trả về ldd.

Điều này sẽ không tìm thấy tất cả trong số họ và sẽ cung cấp quá nhiều kết quả cho một số (như libc) nhưng nó có thể hữu ích.


@FaheemMitha chỉ ra rằng apt-file có thể là một cách tốt hơn. Ví dụ:

ldd /bin/bash | awk '/=>/{print $(NF-1)}'  | 
 while read n; do apt-file search $n; done |
  awk '{print $1}' | sed 's/://' | sort | uniq

Điều đó sẽ trả về một danh sách các tên gói cung cấp các thư viện được liên kết.


1
apt-file searchtrên tập tin thực tế ở bên phải của mũi tên có thể hiệu quả hơn.
Faheem Mitha

@FaheemMitha điểm rất tốt, cảm ơn. Trả lời chỉnh sửa.
terdon

Làm thế nào để điều chỉnh lệnh để kiểm tra sự tồn tại của thư viện trên hệ thống để tìm những thứ cần tải xuống? Tôi nghĩ rằng câu hỏi tôi đã hỏi gần đây là nhiều hơn theo dòng đó. Tôi đang yêu cầu mở lại.
vfclists

@vfclists không có giá trị thực sự, chỉ apt-get installtất cả chúng và bất kỳ cái nào đã được cài đặt sẽ bị bỏ qua.
terdon

Lý do là để tạo một VM không có thư viện thừa để tải xuống nhanh chóng. Các bản cài đặt gói chứa rất nhiều vật phẩm không cần thiết và tôi chỉ cần các tệp thư viện và các phụ thuộc của chúng được yêu cầu bởi các tệp thực thi. Nó cũng cho tôi cơ hội trau dồi kỹ năng bash và Linux của tôi. Không có trăn.
vfclists

3

Câu trả lời của @ terdon là tuyệt vời nhưng thậm chí còn dễ dàng hơn khi sử dụng tính năng dpkg-querynày không giống như apt-fileđược cài đặt theo mặc định trên các hệ thống Debian.

ldd /bin/bash | awk '/=>/{print $(NF-1)}' | while read n; do dpkg-query -S $n; done | sed 's/^\([^:]\+\):.*$/\1/' | uniq

Điều này tạo ra một danh sách các gói.


1

Đặt cược tốt nhất của bạn là tìm một gói thực sự hỗ trợ phân phối của bạn. Nhưng nếu điều đó không hiệu quả với bạn thì tôi chỉ biết một cách khác.

Chạy ldd như bạn có, sau đó cài đặt thủ công các phụ thuộc đó.

Ví dụ libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Đối với tôi có nghĩa là cài đặt apt-get install libpango:i386và cầu nguyện rằng phiên bản trong Debian không ổn định là đủ tốt.

Bạn sẽ cần phải đi qua từng dòng ldd, Google, tìm trong kho lưu trữ có sẵn của bạn và về cơ bản gặp may mắn. Sau đó cài đặt từng cái một. Cho đến khi chương trình thực sự chạy. ldd sẽ chỉ làm việc cho các chương trình "đơn giản". Các chương trình gọi plugin hoặc chạy mã tùy ý là một vấn đề khác nhau. Đối với những người bạn sẽ cần phải chạy từ bảng điều khiển và khắc phục sự cố / lỗi khi chúng xảy ra.

Điều đó nói rằng, một nhị phân chỉ thực thi là rất khó để duy trì. Bạn có thể muốn xem xét sử dụng một cái gì đó khác. Nếu bản phân phối của bạn đi trước một chút, hoặc một chút phía sau hệ thống được xây dựng có thể thực thi được, bạn có thể không bao giờ làm cho nó hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.