2012-09-20 1 views
53

install_name_tool을 사용하여 실행 파일의 rpath를 변경하고 싶지만 현재 rpath가 무엇인지 알 수 없습니다. install_name_tool은 이전 rpath와 새로운 rpath가 명령 줄에 제공되어야합니다. OSX에서 실행 파일의 rpath를 인쇄하려면 어떤 명령을 사용할 수 있습니까?OSX에서 실행 파일의 rpath 인쇄

답변

70

우선 실행 파일에 하나의 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 항목 아래의 경로를 확인합니다.

+2

"-id은' @ loader_path'? – nn0p

+0

@ nn0p loader_path를 이해하는 데 도움이되는 [이 기사] (https://wincent.com/wiki/@executable_path,[email protected][email protected])를 발견했습니다 –

+0

내 otool에서 LC_RPATH를 볼 수 없습니다 - l 출력이지만 LC_ID_DYLIB cmd 항목 다음에 오는 이름 필드 아래에 설치 이름이 표시됩니다 –

1

나는 현재 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 트릭을 아는 사람이 있습니까?

-1

난 그냥 otool 명령

otool -L <my executable> 

그것은 RPATH 필드를 출력을 사용합니다. 긴 스크립트가 필요 없습니다.

+3

사용 된 공유 라이브러리의 경로를 인쇄합니다.이 경로는 @rpath를 사용할 수 있지만 'otool -L'은 않습니다 내가 테스트 한 라이브러리에서 lib의 자체 LC_RPATH 엔트리를 포함하지 않는다. – Baggers

+0

otool -L의 첫 번째 경로를 말할 수있는 한, r은 rpath이며 otool -D가 출력하는 것과 같다. –

1

oscx에서 공유 라이브러리의 설치 이름을 otool -D을 사용하여 인쇄 할 수 있다는 것을 알게되었습니다.

또한, 내가 install_name_tool하는 -id 플래그를 전달하여 이전 설치 이름을 참조하지 않고 직접 설치 이름을 설정할 수 있습니다 install_name_tool는 @의 RPATH/내/경로 MYLIB은 무엇