MacOSX: ce biblioteci dinamice sunt legate prin binare? (Programare, Macos, Ldd, Rpath, Otool)

Cris Luengo a intrebat.
a intrebat.

Nu am reușit să-mi dau seama de ce nu se încarcă binarele mele. Este un dylib încărcat de MATLAB (MEX-file) și se leagă de câteva dylibs în diferite locații. MATLAB îmi spune că nu poate încărca fișierul MEX, dar nu-mi pot da seama care dintre dependențele sale nu le poate găsi.

Are cineva vreo sugestie despre cum să depaneze așa ceva?

Pe Linux, ldd este instrumentul perfect pentru a depana această problemă. Oamenii continuă să spună că otool -L este echivalentul MacOS pentru Linux ldd, , dar acest lucru nu este adevărat. ldd caută de fapt bibliotecile și vă spune care dintre ele pot fi găsite și unde au fost găsite. otool -L vă spune doar ce biblioteci sunt necesare pentru a face legătura cu acestea. Nu depune niciun efort pentru a verifica dacă acestea există. Nici măcar nu vă spune unde sunt căutate bibliotecile atunci când utilizează @rpath.

otool -l (L minuscul) vă oferă o descărcare a „comenzilor de încărcare”, acolo puteți vedea LC_RPATH comenzi, care stabilesc unde @rpath bibliotecile sunt căutate. Dar acestea nu au reușit să-mi explice care dependență nu este găsită.

2 răspunsuri
rob mayoff

Încercați să setați aceste variabile de mediu înainte de a rula matlab:

export DYLD_PRINT_LIBRARIES=1
export DYLD_PRINT_LIBRARIES_POST_LAUNCH=1
export DYLD_PRINT_RPATHS=1

Rulați man dyld pentru mai multe posibilități.

De asemenea, puteți seta variabilele doar pentru comanda matlab astfel:

DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 DYLD_PRINT_RPATHS=1 matlab

Comentarii

  • Acest lucru este excelent, vă mulțumesc foarte mult! Matlab are un script de pornire care se pare că nu transmite variabilele de mediu către executabil, așa că am adăugat aceste variabile în script. De asemenea, am folosit DYLD_PRINT_TO_FILE. –  > Por Cris Luengo.
apmccartney

Răspunsul lui Rob Mayoff este o soluție excelentă atunci când lucrați cu executabile. Dacă considerați că aveți nevoie să verificați dependențele de execuție ale unei dylib, următorul script my-ldd poate fi util.

#!/usr/bin/env bash 

while getopts "r" OPTION; do
  case $OPTION in   
    r) export DYLD_PRINT_RPATHS=1;;
  esac
done
shift $((OPTIND-1))

cp `which true` .
DYLD_PRINT_LIBRARIES=1 
DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 
DYLD_INSERT_LIBRARIES=$1 
./true
rm ./true

unde a scriptul poate fi apelat ca

my-ldd ./foo.dylib

sau (cu încercările rpath echo’d)

my-ldd -r ./foo.dylib

Comentarii

  • Frumos! Care este motivul pentru care acest lucru are nevoie de o copie locală a true binar? Am încercat să execut /usr/bin/true în acest mod și nu funcționează. –  > Por Cris Luengo.
  • Am întâlnit aceeași problemă. Este o măsură de securitate sporită pusă în aplicare de Apple. Vedeți acest link pentru mai multe discuții –  > Por apmccartney.