2012-06-05 3 views
7

Tôi có các tác dụng phụ lạ khi thay đổi LD_LIBRARY_PATH.Tác dụng phụ LD_LIBRARY_PATH

Khi tôi thêm đường dẫn chứa thư viện, ví dụ: :

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

Sau đó, mọi thứ trở nên chậm quá khó tin. Ví dụ: đơn giản ls có thể dài 10 giây.

ldd đầu ra là giống hệt nhau trước và sau khi thay đổi LD_LIBRARY_PATH và tôi đã cố gắng để gỡ lỗi thực hiện chậm ls với strace: Tôi nhận được cùng thực hiện chính xác trong cả hai trường hợp. Việc thực hiện thậm chí không bị kẹt trong khi thực hiện ls (kể từ strace không xuất hiện bất cứ điều gì trong thời gian trễ 10 giây và sau đó đột nhiên thực hiện hoàn toàn ls). Vì vậy, tôi nghĩ rằng nó có thể đến từ vỏ của tôi, nhưng điều này là như nhau, chạy strace trên bash của tôi và thực hiện ls trong cả hai trường hợp cho tôi cùng một đầu ra strace: shell thực thi ls và chờ đến khi kết thúc thực hiện (strace cuối cùng đầu ra trước độ trễ stracewaitpid(...)). Vì vậy, tôi đoán một cái gì đó sai xảy ra giữa sự ra mắt của ls và thực hiện của nó, như thể nó là một vấn đề cấp hạt nhân. Nó thực sự hoạt động như thể một sleep được tạo ra trên ls (0 cách sử dụng CPU).

Trong lag, CPU của tôi và hoạt động mạng là hoàn toàn bình thường ...

Lưu ý rằng các thư viện trong đường dẫn LD mới không xung đột với bất kỳ "thư viện tiêu chuẩn", vì vậy nó không làm phiền ls trong tôi thí dụ.

Vì vậy, tôi rất thú vị trong các giải thích sâu hơn về các hiệu ứng phụ LD_LIBRARY_PATH hoặc cách gỡ lỗi sâu ví dụ của tôi.

+0

Câu hỏi hay. Tôi đã sử dụng 'LD_LIBRARY_PATH' và chưa bao giờ thấy hành vi như vậy, nhưng quan sát của bạn dường như bị cô lập và rõ ràng. Hấp dẫn. – thb

+7

'xuất LD_DEBUG = tất cả' và' người đàn ông 8 ld.so' –

+0

rõ ràng là hiển nhiên nhưng "ldd $ (mà ls)" có thể đưa ra manh mối nếu ls sử dụng bất kỳ thứ gì từ LD_LIBRARY_PATH. – Matthias

Trả lời

0

Tôi không chắc chắn những gì khác nằm trên LD_LIBRARY_PATH hoặc thư viện bạn đang cố gắng thêm hoặc chương trình bạn đang chạy, nhưng có lẽ bạn nên viết kịch bản trình bao bọc để thay đổi LD_LIBRARY_PATH chỉ dành cho chương trình cần thêm thư viện để các chức năng hệ thống của bạn như ls không bị ảnh hưởng.

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 

Tạo tập tin và chmod +x wrapper_name

+1

Có, tôi đồng ý với bạn, nhưng tôi chỉ là nạn nhân của một hệ thống xây dựng hiện có ... –

1

bài này là bỏ thuốc lá cũ, vì vậy tôi không biết nếu bạn tìm thấy đã là một giải pháp. Dù sao, tôi không biết nếu điều này có thể giúp đỡ, nhưng trong hầu hết các hệ thống GNU/Linux hiện đại, việc sử dụng LD_LIBRARY_PATH không được chấp nhận và không khuyến khích.

Vì vậy, tôi có một vài gợi ý:

  1. nếu bạn muốn tiếp tục sử dụng nó, hãy thử đầu tiên bởi trước đang chờ giải quyết thay vì phụ thêm đường dẫn thư viện của bạn vào LD_LIBRARY_PATH. Điều này sẽ giúp nếu có cái gì đó mất nhiều thời gian để quét đường dẫn trong thư mục thư viện trước đó.

  2. Sử dụng hệ thống LDCONFIG, là (mới) cách thích hợp của việc sử dụng thư mục LD hiện nay. Bạn chỉ cần thêm đường dẫn vào thư viện của mình trong tệp /etc/ld.so.conf hoặc tốt hơn, thêm tệp vào /etc/ld.so.conf.d/có chứa đường dẫn đến thư viện của bạn (nó sẽ có nguồn gốc nếu có một chỉ thị bao gồm trong /etc/ld.so.conf, thường là trường hợp theo mặc định). Sau đó, chạy sudo ldconfig để cập nhật đường dẫn tìm kiếm LD hệ thống.

Tôi hy vọng sự trợ giúp này. Chúc mừng