dtruss с DYLD_BIND_AT_LAUNCH и монтированием sshfs в OSX 10.9?

Я пытаюсь создать пример в этой сущности в OSX 10.9:

cd /tmp
git clone https://gist.github.com/ecfd80885b9ddf6734192c056cf48bf4.git fopentest
cd fopentest
bash buildrun.sh

Сборка прошла успешно, и, кроме того, я вижу в выводе терминала следующее:

...
+ DYLD_BIND_AT_LAUNCH=YES
+ ./fopentest.exe ./mytestfile.txt
This is a wrapper function for fopen.
=== this is mytestfile.txt ===
Second line here...
Third line here...

Это будет означать, что вызов DYLD_BIND_AT_LAUNCH=YES ./fopentest.exe ./mytestfile.txt успешно нашел библиотеку-оболочку и функцию.

Теперь, просто в качестве теста, я хотел бы запустить этот исполняемый файл через dtruss, эквивалент OSX «strace» — я также сделал sudo chmod u+s /usr/sbin/dtrace, как рекомендуется в этой ссылке. Итак, я пытаюсь в папке /tmp:

$ DYLD_BIND_AT_LAUNCH=YES dtruss ./fopentest.exe ./mytestfile.txt 2>&1 | grep wrap
This is a wrapper function for fopen.
stat64("libwrapper.dylib\0", 0x7FFF5A7DF248, 0x7FFF5A7E00E0)         = 0 0
open("libwrapper.dylib\0", 0x0, 0x0)         = 3 0
write_nocancel(0x1, "This is a wrapper function for fopen.\n=== this is mytestfile.txt ===\nSecond line here...\nThird line here...\n\0", 0x6C)      = 108 0

Итак, ясно, что dtruss здесь работает. Однако у меня есть точно такие же файлы в другом каталоге, и почему я пытаюсь запустить те же команды, dtruss терпит неудачу:

$ DYLD_BIND_AT_LAUNCH=YES dtruss ./fopentest.exe ./mytestfile.txt 2>&1 | grep wrap
dyld: Library not loaded: libwrapper.dylib
stat64("libwrapper.dylib\0", 0x7FFF4FD85228, 0x7FFF4FD860C0)         = 0 0
open("libwrapper.dylib\0", 0x0, 0x0)         = -1 Err#2
stat64("/Users/MYNAME/lib/libwrapper.dylib\0", 0x7FFF4FD85A08, 0x7FFF4FD860C0)       = -1 Err#2
stat64("/usr/local/lib/libwrapper.dylib\0", 0x7FFF4FD85A08, 0x7FFF4FD860C0)      = -1 Err#2
stat64("/usr/lib/libwrapper.dylib\0", 0x7FFF4FD85A18, 0x7FFF4FD860C0)        = -1 Err#2

Что может быть причиной этого?


person sdaau    schedule 08.10.2017    source источник


Ответы (1)


Хм, кажется, я понял, в чем причина: каталог, в котором dtruss не находит библиотеку, на самом деле монтируется через sshfs; mount показывает это для этого пути:

MYOTHERNAME@myRemotePC:/media/Test1 on /media/Test1 (osxfusefs, nodev, nosuid, synchronous, mounted by MYNAME)

Итак, если я попытаюсь вызвать DYLD_BIND_AT_LAUNCH=YES dtruss ./fopentest.exe ./mytestfile.txt в /media/Test1/fopentest/, то получу "dyld: Library not loaded: libwrapper.dylib".

Однако, если я перемещу эту папку в другое место в «правильной» файловой системе, скажем, в $HOME: mv /media/Test1/fopentest ~/, мне даже не придется перестраиваться, я могу просто вызвать DYLD_BIND_AT_LAUNCH=YES dtruss ./fopentest.exe ./mytestfile.txt в ~/fopentest/, и вызов завершится успешно...

Не уверен, почему это происходит, поэтому более информативный ответ определенно будет оценен...

person sdaau    schedule 08.10.2017