ld_library_path를 무시하고 링크 시간에 -rpath를 통해 제공되는 라이브러리를 사용하십시오.

StackOverflow https://stackoverflow.com/questions/2408172

  •  18-09-2019
  •  | 
  •  

문제

나는 진정한 통제가없는 환경에 앉아 앉아 있습니다 (나뿐만 아니라 기본적으로 환경을 바꿀 수 없거나 다른 사람에게는 효과가 없음), 내가 영향을 줄 수있는 유일한 것은 어떻게 이진이 제작되었습니다.

내 문제는 환경에 사용중인 컴파일러와 호환되지 않는 LIBSTDC ++를 포함하는 ld_library_path를 지정한다는 것입니다. 정적으로 컴파일하려고 시도했지만 G ++에는 불가능한 것 같습니다 (버전 4.2.3, 이후 버전에서는이 방향으로 작업 한 것으로 보입니다.

이제 나는 Rpath를 사용하여 절대 경로 이름을 실행 파일로 굽는 데 도착했습니다 (작동 할 모든 기계는 동일합니다). 불행히도 LD_LIBRARY_PATH가 RPATH보다 우선하는 것처럼 보입니다 (LD_LIBRARY_PATH는 라이브러리를 찾을 수 있음을 확인했지만 위에서 언급 한 바와 같이 LD_LIBRARY_PATH는 모든 사람을 위해 설정 될 것입니다).

ld_library_path보다 rpath가 우선 순위를 차지할 수있는 방법이 있습니까, 아니면 내 문제에 대한 다른 해결책이 있습니까? 런타임시 동적 링크에 대해 이야기하고 있으며 Compile 및 Link Time에서 명령 줄을 제어 할 수 있습니다.

감사.

도움이 되었습니까?

해결책

연결 libstdc++.a 까다 롭지 만 확실히 가능합니다. 지침 여기.

나는 당신의 주장에 대해 약간 회의적입니다 LD_LIBRARY_PATH "Baked in"보다 우선합니다. DT_RPATH 그러나 적어도 Linux와 (나는 믿는다) Solaris, LD_LIBRARY_PATH 이후에만 살펴 봅니다 DT_RPATH 조회가 실패했습니다.

다른 팁

이 프로그램의 환경을 수정하는 쉘 래퍼를 사용할 수 있습니까?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

이렇게하면 실행하기 전에 ld_library_path에 과부하가 걸린 다음 래퍼를 Exec를 통해 바이너리로 교체해야합니다.

이것이 도움이 될까요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top