루트 없이 프로세스를 숨기거나 파일 시스템 경로에 마운트할 수 있는 방법이 있습니까? 실제 파일 시스템에는 영향을 주지 않고 프로세스 자체와 해당 하위에만 영향을 미쳐야 합니까?
약간 이상한 사용 사례이지만 일반 OSX 시스템인 것처럼 OSX 빌드 서버에서 무언가를 빌드해야 합니다. 그러나 불행하게도 빌드를 엉망으로 만드는 일부 라이브러리가 설치되어 있었고 /usr/local/{include,lib}
컴퓨터에 대한 루트 액세스 권한이 없었습니다. 그래서 /usr/local
달리는 동안 임시로 숨기고 싶어요 configure
.make
쓰기 권한이 없어서 /usr/local
실제로 수정할 수는 없습니다.
답변1
아니요, 직접 수행할 수 있는 방법은 없습니다. chflags hidden
물건을 숨기는 데 사용할 수 있어요발견자, 그러나 이는 명령줄에 영향을 주지 않습니다.
해결 방법은 구성 스크립트에 따라 다릅니다. 그것가능한보기만 해도 PATH
알 수 있지만 /usr/local
, 살펴봐야 할 하드코드된 디렉토리 목록이 있을 가능성이 높습니다 /usr/local
. 전자를 수정하려면( PATH
-를 기준으로) 경로를 조정할 수 있습니다. 후자의 경우 유일한 효과적인 방법은 configure
스크립트를 수정하는 것입니다.
하드코딩된 목록이 표시되는 이유는 추가 기능이 시스템의 나머지 부분과 동일한 검색 경로를 사용하지 않을 수 있기 때문입니다. 예를 들어 다양한 BSD 포트 등을 사용할 수 있으며 /usr/pkg
,/usr/local
부분적으로종속성 패키지 도구는 빌드 스크립트에서 이러한 경로 이름을 설정합니다. 그러나 포트 시스템의 일부로 구축되지 않은 프로그램은 사용자의 주의를 거의 기울이지 않고 구축하기 위해 이러한 위치에서 항목을 찾아야 합니다.
OSX의 기본 검색 경로를 무시하려면 ld
다음과 같은 매뉴얼 페이지로 시작하십시오.
검색 경로
ld
사용할 라이브러리나 프레임워크를 검색하기 위한 디렉토리 목록을 유지합니다. 이것기본도서관 검색 경로는 다음과 같습니다./usr/lib
그 다음에/usr/local/lib
. 이것-L
옵션은 새로운 라이브러리 검색 경로를 추가합니다. 기본 프레임워크 검색 경로는 다음과 같습니다./Library/Frameworks
그 다음에/System/Library/Frameworks
. (참고: 이전에는/Network/Library/Frameworks
기본 경로의 끝에 위치합니다. 해당 기능이 필요한 경우 명시적으로 추가해야 합니다.-F/Network/Library/Frameworks
). 이것-F
옵션은 새로운 프레임워크 검색 경로를 추가합니다. 이것-Z
옵션은제거하다표준 검색 경로. 이것-syslibroot
옵션은 모든 검색 경로에 접두사를 추가합니다.
ld
옵션 앞에 접두사를 붙여 옵션을 전달 합니다 -Wl
(공백이 필요한 경우 쉼표를 사용). 귀하의 목적에 맞게 스크립트를 작성하게 됩니다.
-Z
검색 경로를 제거하기 위해- 사용해야 하는 섹션을 다시 추가하세요.
-L
이 clang
옵션은 -v
자세한 정보를 보여줍니다번역가예를 들어 다음을 사용하여 디스플레이 -v
에 전달됩니다.ld
-Wl,-v
링커의세부 사항.
예를 들면 다음과 같습니다.
#!/bin/sh
clang -Wl,-Z -L/usr/lib -F/Library/Frameworks -F/System/Library/Frameworks "$@"
clang
매뉴얼 에는 문서화되어 있지 않지만 간단한 확인을 -Z
통해 링커에 간단한 옵션을 전달한다는 것을 알 수 있습니다. 반면에 clang
문서 옵션(주로 gcc 호환성을 위한)은 포함 디렉터리의 다양한 범주에 대한 검색을 억제합니까?
-nostdinc
Do not search the standard system directories or compiler
builtin directories for include files.
-nostdlibinc
Do not search the standard system directories for include files,
but do search compiler builtin include directories.
-nobuiltininc
Do not search clang's builtin directory for include files.
포함된 파일의 검색 경로를 표시하는 옵션은 없지만 전처리기를 실행하여 이를 추론할 수 있습니다.
스크립트가 작동하고 스크립트를 실행하면 스크립트 이름을 configure
설정할 수 있습니다 . 예를 들어 다음과 같습니다.CC
./configure CC=cc-system
나는 한동안 이 작업을 해왔지만 이 특정 조합은 필요하지 않았습니다(참조컴파일러 래퍼).
답변2
프로세스가 협력하고 있고(즉, 숨겨진 문제를 의도적으로 해결하려고 시도하지 않음) 동적으로 연결된 실행 파일이라고 가정하면 다음을 사용할 수 있습니다.DYLD_PRELOAD
(이것은 대부분의 다른 Unix 변형에서 부르는 OSX 이름입니다. LD_PRELOAD
) 파일 조회 기능이 포함된 라이브러리를 로드하고 일부 결과를 위조합니다.
여기당신이 원하는 거의 모든 것을 수행하는 코드 예제입니다. 프로그램이 보기를 원하지 않는 파일에 액세스하는 방식에 따라 다른 기능을 재정의해야 할 수도 open
있습니다 access
.
답변3
따라서 실제로 특정 디렉터리를 숨기고 싶지 않고 스크립트가 configure
해당 디렉터리에서 특정 파일을 찾을 수 없도록 하기만 하면 됩니다.
이를 수행하는 가장 쉬운 방법은 아마도 configure.ac
편집기에서 열고 포함된 파일이나 라이브러리를 검색하지 않도록 편집한 다음 스크립트를 /usr/local
다시 생성하는 것입니다 . 또는 결국 쉘 스크립트이므로 직접 편집 configure
할 수도 있습니다 . configure
그러나 이는 스크립트가 생성되기 때문에 조금 더 복잡합니다.
답변4
빌드를 위해 선택한 라이브러리와 configure
스크립트 설정 방법에 따라 configure
라이브러리를 제공하는 "외부 패키지"를 사용하지 말라고 지시하거나 다른 경로에서 찾아 사용을 비활성화할 수 있습니다.
이를 수행하는 방법은 configure
일반적으로 다음과 같습니다.
$ ./configure --without-PACKAGE
패키지 사용을 비활성화합니다. 또는
$ ./configure --with-PACKAGE=PATH
PACKAGE
라이브러리를 제공하는 "외부 패키지"이고 PATH
설치 패키지의 접두사 경로인 다른 경로를 지정하여 설치하세요 .
또 다른 해결책은 대상 머신과 동일한 구성으로 가상 머신을 설정하고 거기에 구축하는 것입니다.