2011-03-31 3 views
0

나는 정상적인 동작의 일부로 fork()/execs()라는 불안정한 레거시 코드가 포함 된 다른 실행 파일을 공유하는 C++ 공유 라이브러리가 있습니다. 이 실행 파일은이 라이브러리 이외에는 유용하지 않으므로 PATH 디렉토리에 두는 것을 피하고 싶습니다. 또한 다양한 위치에 여러 복사본을 설치할 수 있기를 원하므로 하드 코딩 된 경로는 바람직하지 않습니다. exec()가이 실행 파일을 찾을 수 있도록하는 RPATH와 동일한 것이 있습니까? 또는 라이브러리 자체에서 공유 라이브러리의 rpath를 쿼리 할 수 ​​있습니까?실행 파일에 해당하는 RPATH

편집 :이 게시물은 후자가 가능하다는 것을 나타냅니다. 아무도 질문 된 질문에 대한 답변을 알고 있기 때문에이 정보를 공개 할 것입니다. Is there a way to inspect the current rpath on Linux?

+0

홉스, 자동 도구를 사용하고 있습니까? –

+0

larsmans : 자동 도구가 없습니다. Cmake. – tgoodhart

+0

확인. 별로 중요하지 않습니다. Autotools는 백엔드 바이너리를'$ prefix/libexec' 디렉토리에 두는 것을 지원합니다.이 디렉토리는이 장소의 전통적인 장소입니다. FHS에서는'/ usr/{local /} lib/PACKAGE'입니다. 그 질문에 직접 대답하지 않지만 적어도 우분투는'RPATH'에 대해 조언합니다. –

답변

1

언제든지 getenv을 사용하여 공유 객체 내에서 환경을 얻을 수 있지만 실제로 사용하려는 것은 RPATH입니다. 공유 객체가 사용자의 홈 디렉토리 (또는 커스텀 환경 변수)에 어떤 종류의 설정 파일을 가지고있어 그것을 사용할 위치를 알려주는 것이 더 좋지 않겠는가?

+0

커스텀 환경 변수는 꽤 큰 구현 세부 사항을 노출 할 것이므로 바람직하지 않습니다. 실행 파일의 위치를 ​​보장 할 수 없기 때문에 구성 파일을 작성하는 것이 어려울 수 있으며 실행 파일을 여러 개 복사 할 수 있도록 지원하고 싶습니다. 나는 RPM 포스트 설치 스크립트의 일부로 설정 파일을 쓸 수도 있고, 또는 그와 동등한 것들을 쓸 수도있다. 비록 내가 그 프로세스가 라이브러리의 모든 사용자에게 투명 해지길 바란다. – tgoodhart

0

이 작업을 수행하는 가장 좋은 방법은 환경 변수를 설정하고 execve()을 사용하여 이진을 실행하는 것입니다. 아마도 PATH을 설정하고 execve()을 PATH를 사용하여 실행 파일의 복사본을 찾는 쉘을 설정할 수 있습니다. 라이브러리 동등 물은 LD_LIBRARY_PATHexecve()을이 라이브러리가 종속되어있는 바이너리로 설정하는 것입니다.

두 경우 모두 외부 환경을 변경하지 않고 execve()과 함께 사용되는 수정 된 복사본 만 제조합니다.