2009-04-15 5 views
2

HP 플랫폼에서만 LD_PRELOAD가 강제 실행되지만 다른 유닉스 버전에서는 그렇지 않습니다 (AIX, Linux 및 Solaris).HP/UX에서 XML :: LibXML :: Common을 사용하기 위해 libcl.2에 LD_PRELOAD를 사용해야하는 이유는 무엇입니까?

모든 Unix 맛보기에 Perl Module XML::LibXML::Common을 내장했습니다. HP 플랫폼에서만 libcl.2 라이브러리에 대해 LD_PRELOAD를 특별히 수행해야했습니다. 다른 유닉스 플랫폼에서는 아무것도 필요하지 않았습니다.

HP 동작 환경이나 HP 로더/컴파일러에 실제로 없습니까?

은 단순히 ":: LibXML :: SAX XML"

use XML::LibXML::SAX; 
$x = XML::LibXML::SAX->new(); 

의 새로운 객체를 생성하는 펄 스크립트를 실행 한하고

에 대한 불평

로드 할 수 없습니다 'site_perl/5.8.8/PA-RISC2.0 모듈 용 XML/LibXML/Common/Common.sl 'XML :: LibXML :: Common : Exec 형식 오류

libcl.2에 대한 LD_PRELOAD 오류가 발생합니다. Perl은 다중 스레드 지원을 위해 개발되었습니다.

답변

1

질문이 명확하지 않습니다 ... 왜 LD_PRELOAD를 사용해야합니까?

HP-UX가 LD_LIBRARY_PATH 대신 SHLIB_PATH를 사용하므로 잘못된 환경 변수를 설정 했습니까?

다른 플랫폼에도 다른 철자가 있습니다. Solaris와 Linux는 동일한 환경을 공유합니다. vars. MacOS X는 DYLIB_LIBRARY_PATH를 사용합니다. AIX는 LIBPATH를 사용합니다.

+0

예 HP에서 LD_PRELOAD를 수행해야했습니다. 환경에 대해 LIBPATHS (동의어가 OS에 따라 다르다고 생각하는 것)를 어디에서 찾을 수 있는지에 대해 이야기하는 것이 아닙니다. 내가 의미하는 바는 구체적으로 라이브러리를로드해야하고 이것은 env에서 지정하는 라이브러리를 찾는 것과 관련이 없습니다 변수. 나는 이해가되기를 바랍니다. – kadeshpa

+0

왜 라이브러리를로드해야합니까? 다른 라이브러리의 심볼을 덮어 쓰시겠습니까? 대체해야 할 libcl.sl이 있습니까? LD_PRELOAD를하기 전에 무엇이 잘못되었는지 설명하지 않았습니다. 그래서 나는 혼란 스럽다. 다른 답변이 없다는 것은 다른 사람들도 마찬가지라는 것을 의미합니다. –

2

왜 사용해야하는지 묻고 싶습니다. Perl을 사용하고 있다면 다중 스레드로 호출하는 라이브러리 중 하나가 libc보다 먼저로드되고 있으며 단일 스레드 일 가능성이 높습니다. 종속성 처리의 일부로 사용자 환경에 멀티 스레드 라이브러리를로드하려고 시도하고 있습니다. LD_PRELOAD를 사용하여 안전하지 않은 라이브러리를로드하기 전에 해당 라이브러리를로드하도록 라이브러리 삽입의 원칙을 사용한다고 생각합니다. 개재의 개념은 복잡 하나이며 다음과 같은 link에서 몇 가지 이점을 얻을 수 있습니다

발췌 : 당신은 특별한 공유 라이브러리와 세트를 만들 필요

하는 라이브러리 개재를 사용하려면 LD_PRELOAD 환경 변수 . LD_PRELOAD가 설정되면 공유 라이브러리를 검색 할 때 동적 링커는 지정된 라이브러리를 사용합니다.

0

이 내용과 관련이 있는지는 잘 모르겠지만 아마도 그럴 것입니다. HP-UX에 포함 된 Perl은 표준 Perl이 아니지만 ActiveState Perl의 복사본입니다. 다른 모든 환경과 달리 HP-UX에서 Perl이 이상하게 작동하는 경우 ActiveState Perl이 잘못되었는지 확인하십시오.

0

오래된 주제이지만 지금 HP-UX에서 비슷한 것을보고 있습니다. 제 경우에는 Perl이 아니지만 Python의 sqlite3 바인딩을 빌드하는 동안 /usr/lib/libcl.2의 동적로드가 실패합니다.

--with-libs = '-lcl'과 함께 configure 스크립트를 실행했습니다. 바이너리와 링크하고 LD_PRELOAD를 사용하는 것은 같지 않지만 /usr/lib/libcl.2가로드 될 때 두 변경 사항이 동일합니다. 그것이 내 문제를 해결 했으므로 시도해보십시오.