2017-05-12 4 views
0

제 응용 프로그램의 경우 DYLD_INSERT_LIBRARIES를 사용하여 라이브러리를 전환합니다. 저는 Mac OS X, El Capitan을 사용하고 있습니다. 나는 내 껍질에서 이러한 환경 변수를 설정하면bash를 통해 응용 프로그램을 호출 할 때 dyld_insert_libraries가 무시되었습니다.

는 :

내가 직접 내 응용 프로그램을 실행하는 경우
export PYTHONHOME=${HOME}/anaconda 
export DYLD_INSERT_LIBRARIES=${HOME}/anaconda/lib/libpython2.7.dylib:${HOME}/anaconda/lib/libmkl_rt.dylib 

, 그것은 제대로 작동합니다. 그러나 내가 작성한 bash 스크립트를 통해 호출하면 DYLD_INSERT_LIBRARIES은 무시됩니다.

bash 스크립트에 동일한 2 줄을 추가하면 응용 프로그램이 다시 작동합니다.

이 테스트 스크립트에서 입증 된 것처럼 DYLD_INSERT_LIBRARIES은 bash 스크립트가 호출 될 때 설정이 해제 된 것 같습니다.

#!/bin/bash 
set -e 
echo ${DYLD_INSERT_LIBRARIES} 

bash는 스크립트 상속을하자 DYLD_INSERT_LIBRARIES을 통과 할 수있는 방법이 있습니까?

+0

내 프로필이나 스크립트에 내보내기를 추가하지 않는 이유는 무엇입니까? –

+0

이 스크립트는 크로스 플랫폼으로되어 있습니다. ''DYLD_INSERT_LIBRARIES''는 시작 스크립트에서 내 응용 프로그램에 대한 명령과 함께 호출되어야합니다. 이제는 bash가 DYLD_INSERT_LIBRARIES 및 DYLD_LIBRARY_PATH를 존중하도록하는 방법에 대해 더 궁금합니다. – Juan

+0

'DYLD_INSERT_LIBRARIES'는 리눅스에서는 적용 할 수 없으며,'LD_PRELOAD'입니다. –

답변

1

이것은 최근 macOS 버전의 보안 기능입니다.

실행 파일 bash 실행 파일이 "제한적"으로 표시되어 DYLD_ * 기능이 비활성화되었습니다. 이 문제를 해결하려면 bash 사본을 만들어 대신 사용할 수 있습니다.

dyld의 구현에서 다음 세부 사항을 살펴보면이 제한 사항이 최소한 10.6으로 되돌아갑니다. 마찬가지로 당신이 볼 수

// any processes with setuid or setgid bit set or with __RESTRICT segment is restricted 
if (issetugid() || hasRestrictedSegment(mainExecutableMH)) { 
    gLinkContext.processIsRestricted = true; 
} 
... 
if (csops(0, CS_OPS_STATUS, &flags, sizeof(flags)) != -1) { 
    // On OS X CS_RESTRICT means the program was signed with entitlements 
    if (((flags & CS_RESTRICT) == CS_RESTRICT) && usingSIP) { 
     gLinkContext.processIsRestricted = true; 
    } 
    // Library Validation loosens searching but requires everything to be code signed 
    if (flags & CS_REQUIRE_LV) { 
     gLinkContext.processIsRestricted = false; 
... 

: 제한을 설정하는 실제 논리가 configureProcessRestrictions에 그러나

// For security, setuid programs ignore DYLD_* environment variables. 
// Additionally, the DYLD_* enviroment variables are removed 
// from the environment, so that any child processes don't see them. 

: 맥 OS 10.13 dyldimplementation이 논리에서

는 코멘트와 함께, pruneEnvironmentVariables에 , issetugid, hasRestrictedSegmentCS_RESTRICT/SIP 권한에 따라 다릅니다. 제한된 상태를 직접 테스트 할 수도 있고,이 정보를 기반으로 직접 이러한 조건을 테스트하는 함수를 만들 수도 있습니다.