2012-06-05 3 views
7

변경에 이상한 부작용이 있습니다. LD_LIBRARY_PATH.LD_LIBRARY_PATH 부작용

라이브러리가 포함 된 경로를 추가 할 때 (예 : :

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

그러면 모든 것이 믿을 수 없을 정도로 느려집니다. 예를 들어, 간단한 ls은 10 초 길이가 될 수 있습니다.

ldd 출력은 동일 전과 LD_LIBRARY_PATH 변경 후 정확히 내가 strace와 느린 ls의 실행을 디버깅하려고 : 나는 두 경우 모두 동일한 실행을 얻을. ls 실행 중에는 실행이 멈추지 않습니다 (strace는 10 초 지연 중에 아무 것도 출력하지 않고 갑자기 ls을 실행하기 때문에). 그래서 내 껍질에서 올 수 있다고 생각했지만, 이것은 동일합니다. 내 bash에서 strace을 실행하고 두 경우 모두 ls을 실행하면 strace 출력이 나타납니다. 쉘은 ls을 실행하고 실행이 끝날 때까지 기다립니다 (마지막 strace). 지연 strace 전에 출력은 waitpid(...)입니다. 그래서 나는 커널 레벨의 이슈 인 것처럼 ls의 실행과 실행 사이에 뭔가 잘못되었다고 생각합니다. (0CPU 사용)에 sleep을 만든 경우와 같이 작동합니다. 지연 동안

, 내 CPU 및 네트워크 활동은 ... 새로운 LD 경로에 라이브러리가 어떤 "표준 라이브러리"와 충돌하지 않는 것을

참고 완벽하게 정상, 그래서에서 ls을 방해하지 않습니다 내 예.

그래서 나는 LD_LIBRARY_PATH 부작용이나 내 예제를 깊이 디버깅하는 방법에 대해 자세히 설명하는 데 흥미 롭습니다.

+0

좋은 질문입니다. 나는'LD_LIBRARY_PATH'를 사용했고 그런 행동을 한 번도 본 적이 없지만, 당신의 관찰은 고립되고 명백한 것처럼 보입니다. 흥미 롭 군. – thb

+7

'export LD_DEBUG = all'과'man 8 ld.so' –

+0

이 명백하게 드러나지 만 ldd가 LD_LIBRARY_PATH에서 무엇인가를 사용한다면 "ldd $ (which ls)"는 단서를 줄 수 있습니다. – Matthias

답변

0

추가하고자하는 라이브러리 나 실행중인 프로그램에 어떤 것이 있는지 잘 모르겠지만 추가 기능이 필요한 프로그램에 대해서만 LD_LIBRARY_PATH를 변경하는 래퍼 스크립트 작성하는 것이 좋습니다. 라이브러리를 사용하여 ls과 같은 시스템 기능이 영향을받지 않도록하십시오.

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 
파일을 작성

+1

예, 동의합니다.하지만 기존 빌드 시스템의 희생자입니다 ... –

1

이 게시물이 chmod +x wrapper_name는 옛 종료, 그래서 해결책을 찾기 나도 몰라. 어쨌든이 방법이 도움이 될지 모르지만 대부분의 현대 GNU/Linux 시스템에서는 LD_LIBRARY_PATH의 사용이 권장되지 않으며과 권장하지 않습니다.

  1. 당신이 그것을 계속 사용하려는 경우

    은 사전중인 대신 LD_LIBRARY_PATH에 라이브러리 경로를 추가하여 첫 번째 시도 :

    그러므로 나는 몇 가지 제안 사항을 알려드립니다. 이전 라이브러리 디렉토리에서 경로를 스캔하는 데 오랜 시간이 걸리는 경우 도움이됩니다.

  2. LDCONFIG 시스템을 사용하십시오. LDCONFIG 시스템은 최근에 LD 디렉토리를 사용하는의 새로운 방법 인 입니다. 라이브러리 경로를 /etc/ld.so.conf 파일에 추가하거나 /etc/ld.so.conf에 파일을 추가하기 만하면됩니다.d /는 라이브러리에 대한 경로를 포함합니다 (보통 /etc/ld.so.conf에 include 지시문이있는 경우 소스가됩니다). 그런 다음 sudo ldconfig을 실행하여 시스템 LD 검색 경로를 업데이트하십시오.

이 도움이 되었기를 바랍니다. 환호