install_name_tool
을 사용하여 실행 파일의 rpath를 변경하고 싶지만 현재 rpath가 무엇인지 알 수 없습니다. install_name_tool
은 이전 rpath와 새로운 rpath가 명령 줄에 제공되어야합니다. OSX에서 실행 파일의 rpath를 인쇄하려면 어떤 명령을 사용할 수 있습니까?OSX에서 실행 파일의 rpath 인쇄
답변
우선 실행 파일에 하나의 rpath
항목이 없지만 하나 이상의 항목이 들어있는 배열임을 이해하십시오.
두 번째로 otool
을 사용하여 이미지의 rpath
항목을 나열 할 수 있습니다. otool -l
사용하면 그중 rpath
항목입니다 맨 끝에, 다음과 같은 출력을 얻을 수 있습니다 다음 LC_RPATH
명령에 대한
Load command 34
cmd LC_LOAD_DYLIB
cmdsize 88
name /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (offset 24)
time stamp 2 Wed Dec 31 19:00:02 1969
current version 1038.32.0
compatibility version 45.0.0
Load command 35
cmd LC_RPATH
cmdsize 40
path @loader_path/../Frameworks (offset 12)
찾는 위치와 path
항목 아래의 경로를 확인합니다.
나는 현재 DYLD을 처리하기 위해 여러 배쉬-3 스크립트를 쓰는 사람이 하나가 질문에 대한 대답, 그래서 참조 할 수 있도록 게시 :
#! /bin/bash
# ######################################################################### #
if [ ${#} -eq 0 ]
then
echo "
Usage: ${0##*/} FILE...
List rpaths in FILEs
"
exit 0
fi
# ######################################################################### #
shopt -s extglob
# ######################################################################### #
for file in "${@}"
do
if [ ! -r "${file}" ]
then
echo "${file}: no such file" 1>&2
continue
fi
if ! [[ "$(/usr/bin/file "${file}")" =~ ^${file}:\ *Mach-O\ .*$ ]]
then
echo "${file}: is not an object file" 1>&2
continue
fi
if [ ${#} -gt 1 ]
then
echo "${file}:"
fi
IFS_save="${IFS}"
IFS=$'\n'
_next_path_is_rpath=
while read line
do
case "${line}" in
*(\)cmd\ LC_RPATH)
_next_path_is_rpath=yes
;;
*(\)path\ *\ \(offset\ +([0-9])\))
if [ -z "${_next_path_is_rpath}" ]
then
continue
fi
line="${line#* path }"
line="${line% (offset *}"
if [ ${#} -gt 1 ]
then
line=$'\t'"${line}"
fi
echo "${line}"
_next_path_is_rpath=
;;
esac
done < <(/usr/bin/otool -l "${file}")
IFS="${IFS_save}"
done
# ######################################################################### #
은 '이 ;-)
NB 도움이되기를 바랍니다 :이 스크립트에 유용 할 수있는 Bash-3 트릭을 아는 사람이 있습니까?
난 그냥 otool 명령
otool -L <my executable>
그것은 RPATH 필드를 출력을 사용합니다. 긴 스크립트가 필요 없습니다.
사용 된 공유 라이브러리의 경로를 인쇄합니다.이 경로는 @rpath를 사용할 수 있지만 'otool -L'은 않습니다 내가 테스트 한 라이브러리에서 lib의 자체 LC_RPATH 엔트리를 포함하지 않는다. – Baggers
otool -L의 첫 번째 경로를 말할 수있는 한, r은 rpath이며 otool -D가 출력하는 것과 같다. –
oscx에서 공유 라이브러리의 설치 이름을 otool -D을 사용하여 인쇄 할 수 있다는 것을 알게되었습니다.
또한, 내가 install_name_tool하는 -id 플래그를 전달하여 이전 설치 이름을 참조하지 않고 직접 설치 이름을 설정할 수 있습니다 install_name_tool는 @의 RPATH/내/경로 MYLIB은 무엇
"-id은' @ loader_path'? – nn0p
@ nn0p loader_path를 이해하는 데 도움이되는 [이 기사] (https://wincent.com/wiki/@executable_path,[email protected][email protected])를 발견했습니다 –
내 otool에서 LC_RPATH를 볼 수 없습니다 - l 출력이지만 LC_ID_DYLIB cmd 항목 다음에 오는 이름 필드 아래에 설치 이름이 표시됩니다 –