Я пытаюсь создать пример в этой сущности в 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
Что может быть причиной этого?