标签: dylib

将Mac二进制文件加载为动态库

我正在使用没有源的二进制可执行文件进行一些逆向工程.在Windows上我可以做的是使用LoadLibrary加载可执行文件(EXE),就像它是一个DLL文件一样.如果加载的文件不可重定位,我可以简单地将我的加载程序代码重新定位到另一个模块的"make space".当我加载二进制文件时,我可以调用它的函数(假设我在哪里,当然),并做其他的事情.

有没有办法在Mac上做同样或类似的事情?我有一个mach-o可执行文件,我想加载它,因为它是一个动态库(DYLIB).或者有没有办法将可执行文件转换为DYLIB?可执行文件和DYLIB之间的真正区别是什么?

macos reverse-engineering dylib dynamic-library

11
推荐指数
1
解决办法
1461
查看次数

在Xcode中,如何链接动态库(libcurl),以便该应用程序也适用于旧版本的Mac OS?

我在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上运行?

我看了几个选项:

  1. 一个是更改Base SDK,如本文所述: Mac OS X libcurl dylib兼容版本如果我这样做,应用程序工作正常.但这对我来说不是一个选择.我必须使用10.7 SDK,因此不能接受回归到旧版本的SDK.

  2. 我尝试使用Other Linker Flags中的-weak_library /usr/lib/libcurl.dylib选项对库进行弱链接.应用程序启动但在我尝试引用libcurl符号时崩溃.但是,我知道不兼容的代码不是问题,因为它在我更改Base SDK时有效.

  3. 我尝试使用dlopen("libcurl.dylib",RTLD_LOCAL | RTLD_LAZY)在代码中动态加载库; 该库似乎加载,但我必须手动绑定我引用的所有符号?

当然必须有办法做到这一点.libcurl库安装在Mac OS 10.5,10.6和10.7上,但应用程序无法在旧版Mac OS上使用可用库.我怎样才能解决这个问题?

macos xcode objective-c dylib libcurl

11
推荐指数
1
解决办法
2925
查看次数

dyld:未加载库.原因:找不到合适的图像

我在这里看了一堆答案,没有人解决我的问题.

我有一个带有自定义框架和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)

我整天都在尝试构建设置而且我完全迷失了.

xcode cocoa frameworks dylib

11
推荐指数
3
解决办法
2万
查看次数

对boost库的依赖没有完整路径

我成功构建了动态库,依赖于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在没有完整路径的情况下给我提升库.

c++ macos boost dylib otool

11
推荐指数
1
解决办法
1196
查看次数

使用dlopen查找dylib版本

有没有办法使用其路径找到dylib的版本?我正在寻找接受与dlopen相同的参数的东西.我查看了NSVersionOfRunTimeLibrary,但是从我对文档的阅读看起来它看起来像是获取当前dylib的版本,而不是路径中指定的版本.

谢谢

dylib dlopen

10
推荐指数
2
解决办法
8111
查看次数

dyld未加载原因:未找到图像libopencv_core.2.4.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)

xcode opencv dylib

10
推荐指数
1
解决办法
1万
查看次数

Apple是否允许iOS上的Qt作为动态库?

通过Qt 5.1中Android/iOS支持的技术预览,是否有关于部署到Apple应用程序商店的新闻?由于Qt的非商业版本是LGPL许可的,并且应用程序商店规则通常不允许使用dylib,因此Digia或Apple方面都不会例外,但许可谈话不提供任何更多 -关于此事的最新信息.

那么,有没有人试图将动态链接的Qt应用程序推送到商店,或者有任何一方的官方声明?

licensing lgpl dylib ios qt5

10
推荐指数
1
解决办法
5464
查看次数

如何从shell编译在macOS Sierra上使用dylib路径的源代码

我正在编译一些源代码,需要我已经构建的其他项目中的一些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的一部分.

我已经尝试过了:

  1. 执行 install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib
  2. 添加-L/usr/local/lib到编译选项.
  3. 将所有dylib路径显式添加到编译选项.
  4. 尝试添加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)

g++ dylib macos-sierra

10
推荐指数
2
解决办法
655
查看次数

在MacOS上创建一个dylib文件,用于Steamworks API的Python包装器

我是一个业余爱好者程序员,试图将SteamworksForPython API集成到基于Python的游戏中.此API是Steamworks API的Python包装器,它仅正式支持C++.我正在研究MacOS Sierra 10.12.6.

盲目地遵循文档,我做了以下事情:

  1. 我已经下载了SteamworksForPython回购.
  2. 我已将Steamworks SDK(/ sdk/public/steam)中的steam头目录添加到该repo.
  3. 我已经在该repo中添加了适用于我的操作系统的Steam API文件(在我的例子中,来自/ sdk/redistributable_bin/osx32的libsteam_api.dylib).

文档中列出的下一步是创建一个新的dylib文件.不幸的是,尚未针对MacOS描述执行此操作的步骤.

看看Linux和Windows的过程,似乎我需要使用repo的SteamworksPy.cpp文件和Steamworks SDK中的steam_api.h头文件来创建这个动态库文件.

我已经研究过如何使用Xcode创建一个dylib文件,目前我正在尝试这样做.该过程看起来类似于使用Visual Studio的Windows 文档所描述的过程.

我做了以下事情:

  1. 我创建了一个类型为普通C++动态库的新Xcode项目.
  2. 我已将SteamworksPy.cpp添加到Compile Sources列表中.
  3. 我已将steam_api.h添加到Headers列表中(在公共列表下,而不是私有或项目中).
  4. 我已将libsteam_api.dylib添加到Link Binary With Libraries部分.

但是,当我尝试构建时,我收到了一个错误.这是一个截图:

在此输入图像描述

以下是链接器错误的更明确的屏幕截图:

在此输入图像描述

看完这个,这个这个,我觉得问题是,Xcode的不知道去哪里找我试图链接到库,所以我需要告诉它在哪里看.这应该很简单,但我无法做到.

谁能给我建议如何继续?


类似的问题很有帮助,但没有让我找到解决方案:

c++ python xcode dylib steamworks-api

10
推荐指数
1
解决办法
289
查看次数

如何将LC_LOAD_DYLIB命令插入Mach-O二进制文件(OSX)

我想用一些代码修补一块废弃软件.

该软件是基于碳的,所以我不能使用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部分......

有人有主意吗?

macos mach-o dylib otool dyld

9
推荐指数
1
解决办法
4481
查看次数