我正在使用没有源的二进制可执行文件进行一些逆向工程.在Windows上我可以做的是使用LoadLibrary加载可执行文件(EXE),就像它是一个DLL文件一样.如果加载的文件不可重定位,我可以简单地将我的加载程序代码重新定位到另一个模块的"make space".当我加载二进制文件时,我可以调用它的函数(假设我在哪里,当然),并做其他的事情.
有没有办法在Mac上做同样或类似的事情?我有一个mach-o可执行文件,我想加载它,因为它是一个动态库(DYLIB).或者有没有办法将可执行文件转换为DYLIB?可执行文件和DYLIB之间的真正区别是什么?
我在OS 10.7 Lion上构建和编译的Mac项目中使用libcurl.我可以使用其他链接器标志中的-lcurl选项或通过将库添加到我的项目来链接到动态库.一切都按照应有的方式运作.
我希望该应用程序也适用于OS 10.6和10.5.我相应地设置了部署目标.当我在其中一个版本的OS中运行应用程序时,我得到一个dyld错误:
库未加载:/usr/lib/libcurl.4.dylib原因:不兼容的库版本:X需要7.0.0或更高版本,但libcurl.4.dylib提供版本6.0.0.
这是Mac OS 10.5的类似问题.
如何在Mac OS 10.7上的Xcode中链接系统的libcurl库,以便应用程序也可以在10.6和10.5上运行?
我看了几个选项:
一个是更改Base SDK,如本文所述: Mac OS X libcurl dylib兼容版本如果我这样做,应用程序工作正常.但这对我来说不是一个选择.我必须使用10.7 SDK,因此不能接受回归到旧版本的SDK.
我尝试使用Other Linker Flags中的-weak_library /usr/lib/libcurl.dylib选项对库进行弱链接.应用程序启动但在我尝试引用libcurl符号时崩溃.但是,我知道不兼容的代码不是问题,因为它在我更改Base SDK时有效.
我尝试使用dlopen("libcurl.dylib",RTLD_LOCAL | RTLD_LAZY)在代码中动态加载库; 该库似乎加载,但我必须手动绑定我引用的所有符号?
当然必须有办法做到这一点.libcurl库安装在Mac OS 10.5,10.6和10.7上,但应用程序无法在旧版Mac OS上使用可用库.我怎样才能解决这个问题?
我在这里看了一堆答案,没有人解决我的问题.
我有一个带有自定义框架和iOS应用程序项目的Xcode工作区.该项目一直工作到今天早上,现在它构建但立即崩溃:
dyld: Library not loaded: @rpath/ONCKit.framework/ONCKit
Referenced from: /private/var/mobile/Containers/Bundle/Application/4DF67A3F-6255-4276-8812-8C742A363995/atero_t.app/atero_t
Reason: no suitable image found. Did find:
/private/var/mobile/Containers/Bundle/Application/4DF67A3F-6255-4276-8812-8C742A363995/atero_t.app/Frameworks/ONCKit.framework/ONCKit: mmap() error 1 at address=0x100118000, size=0x000B8000 segment=__TEXT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/4DF67A3F-6255-4276-8812-8C742A363995/atero_t.app/Frameworks/ONCKit.framework/ONCKit
/private/var/mobile/Containers/Bundle/Application/4DF67A3F-6255-4276-8812-8C742A363995/atero_t.app/Frameworks/ONCKit.framework/ONCKit: mmap() error 1 at address=0x100280000, size=0x000B8000 segment=__TEXT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/4DF67A3F-6255-4276-8812-8C742A363995/atero_t.app/Frameworks/ONCKit.framework/ONCKit
Run Code Online (Sandbox Code Playgroud)
我整天都在尝试构建设置而且我完全迷失了.
我成功构建了动态库,依赖于boost库,这些库是使用自定义前缀(./b2 install --prefix=PREFIX)构建和安装的.但是,当我otool -L在我的库上运行时,我得到如下输出:
...
libboost_regex.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
...
Run Code Online (Sandbox Code Playgroud)
与其他依赖项不同,它没有完全通向这些boost库的路径.当我的lib被应用程序加载时,这会导致运行时错误.我知道可以使用install_name_tool手动修复此问题.但是,我想弄清楚,为什么它只发生在boost库中,并且不会发生在我的lib依赖的其他依赖项上?
编辑
我被要求给出一个构建命令的例子,但像往常一样,"现实生活"的例子有点复杂.就我而言,有一个libA.dylib依赖于提升的库.然后,我的图书馆libMy.dylib依赖libA.dylib和提升.在configure执行简单库存在检查(类似于自定义测试程序AC_CHECK_LIB)的步骤中出现问题.此检查尝试构建一个与之相关联的小测试程序,libA.dylib以证明其可用性libA.dylib并且失败 - 由于无法找到增强库的错误.当然它不会找到它们因为otool -L libA.dylib在没有完整路径的情况下给我提升库.
有没有办法使用其路径找到dylib的版本?我正在寻找接受与dlopen相同的参数的东西.我查看了NSVersionOfRunTimeLibrary,但是从我对文档的阅读看起来它看起来像是获取当前dylib的版本,而不是路径中指定的版本.
谢谢
我仍然是Objective C和Xcode的新手,但我刚刚完成了一个使用openCV的小应用程序libopencv_core.2.4.2.dylib.
当我在另一台机器上打开最终构建的应用程序时,OS X向我抛出了这个错误:
Dyld Error Message: Library not loaded: */libopencv_core.2.4.dylib
Referenced from: /Users/USER/Desktop/my
app.app/Contents/MacOS/my app
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
为什么我的应用在这里寻找2.4而不是2.4.2?
我已经检查过:
我添加了一个新的构建阶段 - >因此将libopencv_core.2.4.2.dylib其复制到应用程序包(通过Xcode中的"Copy Bundle Resources") - libopencv_core.2.4.2.dylib现在位于我的app.app/Resources
我错过了什么?我是否设置了更多的库搜索路径或类似的?
我也做了什么:
install_name_tool -id "@executable_path/../Frameworks/libopencv_core.2.4.2.dylib" libopencv_core.2.4.2.dylib
Run Code Online (Sandbox Code Playgroud)
将dylib复制到Frameworks目录也不起作用:
Library not loaded: @executable_path/../Frameworks/libopencv_core.2.4.2.dylib
Run Code Online (Sandbox Code Playgroud)
不知道现在该做什么-在dylib 是在我的应用程序的框架目录...
otool -L在二进制文件上使用给了我:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
@loader_path/../Frameworks/libopencv_core.2.4.2.dylib (compatibility version 2.4.0, current version 2.4.2)
@loader_path/../Frameworks/libopencv_highgui.2.4.2.dylib (compatibility version 2.4.0, current version 2.4.2)
@loader_path/../Frameworks/libopencv_imgproc.2.4.2.dylib (compatibility version 2.4.0, current …Run Code Online (Sandbox Code Playgroud) 通过Qt 5.1中Android/iOS支持的技术预览,是否有关于部署到Apple应用程序商店的新闻?由于Qt的非商业版本是LGPL许可的,并且应用程序商店规则通常不允许使用dylib,因此Digia或Apple方面都不会例外,但许可谈话不提供任何更多 -关于此事的最新信息.
那么,有没有人试图将动态链接的Qt应用程序推送到商店,或者有任何一方的官方声明?
我正在编译一些源代码,需要我已经构建的其他项目中的一些dylib.我越来越
ld:找不到架构x86_64`的符号
每当我执行
g++ some_code.cpp -I/usr/local/include -o executable_binary
Run Code Online (Sandbox Code Playgroud)
我知道g++无法找到已编译的dylib(安装在/usr/local/include),因为错误还提到了很多特定符号,这些符号是dylib的一部分.
我已经尝试过了:
install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib-L/usr/local/lib到编译选项.DYLD_LIBRARY_PATH失败,因为Sierra出于安全原因不允许设置该变量.我知道可以添加,DYLD_LIBRARY_PATH但需要禁用SIP.我可以做到这一点,如果有更清洁的方法,我不想这样做.
PS:我正在尝试编译郁金香图库的教程示例.
缺少的符号与我安装的图库有关.错误消息是:
Undefined symbols for architecture x86_64:
"tlp::saveGraph(tlp::Graph*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, tlp::PluginProgress*)", referenced from:
_main in tutorial001-02ee7e.o
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, tlp::Graph const*)", referenced from:
_main in tutorial001-02ee7e.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
每当我这样做ls /usr/local/lib/requiredlib.dylib,郁金香的所有编译库都在那里.
g++ -v 生产:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM …Run Code Online (Sandbox Code Playgroud) 我是一个业余爱好者程序员,试图将SteamworksForPython API集成到基于Python的游戏中.此API是Steamworks API的Python包装器,它仅正式支持C++.我正在研究MacOS Sierra 10.12.6.
盲目地遵循文档,我做了以下事情:
文档中列出的下一步是创建一个新的dylib文件.不幸的是,尚未针对MacOS描述执行此操作的步骤.
看看Linux和Windows的过程,似乎我需要使用repo的SteamworksPy.cpp文件和Steamworks SDK中的steam_api.h头文件来创建这个动态库文件.
我已经研究过如何使用Xcode创建一个dylib文件,目前我正在尝试这样做.该过程看起来类似于使用Visual Studio的Windows 文档所描述的过程.
我做了以下事情:
但是,当我尝试构建时,我收到了一个错误.这是一个截图:
以下是链接器错误的更明确的屏幕截图:
看完这个,这个和这个,我觉得问题是,Xcode的不知道去哪里找我试图链接到库,所以我需要告诉它在哪里看.这应该很简单,但我无法做到.
谁能给我建议如何继续?
类似的问题很有帮助,但没有让我找到解决方案:
我想用一些代码修补一块废弃软件.
该软件是基于碳的,所以我不能使用InputManager(至少,我认为我不能).我的想法是在mach-o标头中添加一个dylib引用,并在调用初始化例程时启动一个新线程.
我使用hexeditor添加了相应的加载命令(LC_ LOAD_DYLIB),并使用mach-o标头.
otool报告我期望看到的内容,因此我非常确信文件格式正确.
Load command 63
cmd LC_LOAD_DYLIB
cmdsize 60
name @executable_path/libAltInput.dylib (offset 24)
time stamp 1183743291 Fri Jul 6 19:34:51 2007
current version 0.0.0
compatibility version 0.0.0
但是,启动二进制文件会给我以下错误
dyld: bad external relocation length
我可以猜到这意味着我需要修改LC_ SYMTAB或LC_ DYNSYMTAB部分......
有人有主意吗?