2017-10-08 50 views
0

我想在this gist在OSX 10.9构建示例:在OSX 10.9中使用DYLD_BIND_AT_LAUNCH和sshfs装入?

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成功找到包装库和函数。

现在,只是作为一个测试,我想通过dtrussOSX “strace” equivalent运行此可执行文件 - 我也做了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 

怎么可能是这个原因?

回答

0

嗯,我想我明白了原因是什么:dtruss未能找到库的目录,实际上是通过sshfs挂载的; mount显示了这个该路径:

[email protected]:/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”。

但是,如果我在“适当”的文件系统移动到其他位置该文件夹,例如在$HOMEmv /media/Test1/fopentest ~/,我甚至不具备恢复重建的,我可以调用~/fopentest/DYLD_BIND_AT_LAUNCH=YES dtruss ./fopentest.exe ./mytestfile.txt和调用成功...

不知道为什么发生这种情况 - 所以一个更丰富的答案肯定会被赞赏...