Печать rpath исполняемого файла на OSX
Я хочу изменить rpath исполняемого файла с помощью install_name_tool
, но я не могу понять, что такое rpath прямо сейчас. install_name_tool
требуется, чтобы в командной строке были указаны как старые, так и новые rpath. Какую команду я могу использовать для печати rpath исполняемого файла под OSX?
4 ответа:
прежде всего, поймите, что исполняемый файл не содержит ни одного
rpath
запись, а массив из одной или нескольких записей.во-вторых, вы можете использовать
otool
чтобы перечислить изображениеrpath
записи. Используяotool -l
, вы получите вывод, как показано ниже, в самом конце которого находятся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)
искать
LC_RPATH
команды и обратите внимание на путь подpath
запись.
в настоящее время я пишу несколько сценариев Bash-3 для обработки DYLD, и этот отвечает на вопрос, поэтому я публикую его для справки :
#! /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, которые могут быть полезны для этого скрипта ?