标签: dylib

如何将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
查看次数

如何在Xcode中链接动态库?

我目前正在Qt中开发一个程序,它使用库libqextserialport.1.dylib.

我构建它并在x-code中运行并且它向后吐:

dyld: Library not loaded: libqextserialport.1.dylib
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV
    Reason: image not found
Run Code Online (Sandbox Code Playgroud)

该库位于/ Users/samuelreh/Desktop/QtOpenCV/qextserialport/build /中.

我可以通过更改为可执行文件夹/Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/来运行我的程序并输入:

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

我知道除此之外可能有很多解决方案.有人知道x-code中最好/最优雅/最容易做的事情吗?

c++ macos xcode dylib

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

链接和使用C++库与Objective-C应用程序

我正在编写一个图形应用程序,使用Objective-C作为前端,使用C++进行图形处理和网络通信.我在Apple的网站上阅读,寻找一种方法将.dylib.so与我的C++代码链接到我的Xcode项目,但似乎没有任何效果.我能够让项目引用它并链接它,但当我试图从.dylib调用函数时,它说它不知道我想要做什么.有谁知道这里发生了什么?

我知道Objective-C有我需要做的图形和网络所有的库,但我只是觉得这样做.我有一段时间没有做太多的C++,我想学习更多的Objective-C,那么有什么比一起使用它们更好的方法呢?

谢谢,罗比

c++ xcode linker objective-c dylib

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

卸载动态库需要两个dlclose()调用吗?

我有一个动态库,我加载使用dlopen()然后卸载使用dlclose();

如果我不包含任何目标c代码dlopen()需要一个dlclose()预期行为的调用.但是当我将任何目标c代码包含在目标中时,我遇到的问题是我需要对dlclose()加载的库进行两次调用才能卸载.

这是预期的行为吗?我该如何解决?

c macos cocoa objective-c dylib

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

Mac OS上的git命令行错误"dyld:找不到符号:___ strlcpy_chk"

我在Mac OS上安装了git,当我尝试创建一个新的存储库时git init,我收到此错误:

 dyld: lazy symbol binding failed: Symbol not found: ___strlcpy_chk
 Referenced from: /usr/local/git/bin/git
 Expected in: /usr/lib/libSystem.B.dylib

 dyld: Symbol not found: ___strlcpy_chk
 Referenced from: /usr/local/git/bin/git
 Expected in: /usr/lib/libSystem.B.dylib

 Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)

注意:我没有安装Xcode.

git macos versions dylib osx-snow-leopard

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

将我的应用程序提交给TestFlight后出现问题

我们发现您最近交付的"AppName"存在一个或多个问题.要处理您的交付,必须纠正以下问题:

无效的捆绑包 - 您的应用程序引用的一个或多个动态库不在dylib搜索路径中.

一旦纠正了这些问题,您就可以重新更新已更正的二进制文件.

问候,

App Store团队

bundle dylib

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

Swift:如何调用从dylib加载的C函数

有没有办法调用从Swift的dylib加载的C函数?

这是我的dylib文件:

cppdemofile.cpp

#include "cppdemofile.h"

int add(int a, int b) {
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

cppdemofile.h

#ifndef __CppDemoLibrary__cppdemofile__
#define __CppDemoLibrary__cppdemofile__

#pragma GCC visibility push(default)

extern "C" int add(int a, int b);

#pragma GCC visibility pop

#endif
Run Code Online (Sandbox Code Playgroud)

编译到dylib并检查:

nm -gU libCppDemoLibrary.dylib
0000000000000f80 T _add
Run Code Online (Sandbox Code Playgroud)

......复制libCppDemoLibrary.dylib~/lib......

Swift程序:

@IBAction func buttonClick(sender: NSButton) {
    let handle = dlopen("libCppDemoLibrary.dylib", RTLD_NOW)
    if (handle != nil) {
        var sym = dlsym(handle, "add")
        if (sym != nil) {
            let pointer …
Run Code Online (Sandbox Code Playgroud)

c macos dylib swift

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

在我的macOS二进制文件中对所有框架运行`strip -S -x`是否有缺点?如果没有,我该如何自动化该过程?

我注意到strip -S -x在我的应用程序'Frameworks'文件夹中的二进制文件上运行(删除所有调试和所有本地符号)使它们缩小了约25%,即使我在构建设置中启用了调试符号的剥离.

另请注意,这使得Swift支持库也变得更小,并且看起来没有用于去除它们的构建设置.另外,我甚至不能100%确定我的"剥离调试符号"设置是否正确(即实际上导致调试符号被剥离),因为它nm --debug-syms仍然显示了大量符号,并且strip -S(删除调试符号表)仍然使它们变小.我的条带设置似乎是您在Internet上找到的推荐设置:

  • 部署后处理:是的
  • 复制期间剥离调试符号:否(无论如何都没有效果,因为框架已经在那时签署了代码)
  • 剥离链接产品:是的
  • 条带样式:调试符号

但运行是否有任何不良副作用strip -S -x,例如以后无法表示堆栈跟踪?

此外,如何在构建过程中自动执行此剥离,同时保持最终代码签名不变?似乎添加-Xlinker -x -Xlinker -S到我的"其他链接器标志"将此过程应用于当前项目的二进制文件(包括框架),但不应用于我的依赖项目中的框架(例如CocoaPods).这是特别相关的,因为相应地修改我包含的CocoaPods项目的构建设置并不容易.如上所述,它也与Swift支持库dylibs相关,它们也没有这样的链接器选项,但仍然受益于这种剥离.

xcode frameworks strip dylib debug-symbols

9
推荐指数
0
解决办法
327
查看次数

编译二进制文件以链接OSX

我正在尝试将二进制文件编译为MACH_O对象文件,以便将其链接到dylib.dylib是用c/c ++编写的.

在linux上使用以下命令:ld -r -b binary -o foo.o foo.bin

我在OSX上尝试了各种选项,但无济于事:

ld -r foo.bin -o foo.o
gives:
ld: warning: -arch not specified
ld: warning: ignoring file foo.bin, file was built for unsupported file format which is not the architecture being linked (x86_64)
Run Code Online (Sandbox Code Playgroud)

创建一个空的.o文件

ld -arch x86_64 -r foo.bin -o foo.o 
ld: warning: ignoring file foo.bin, file was built for unsupported file format which is not the architecture being linked (x86_64)
Run Code Online (Sandbox Code Playgroud)

再次创建空的.o文件.用nm检查文件给出:nm foo.o nm:没有名称列表

二进制文件实际上是将下载到外部设备的固件.

谢谢你的期待

macos dylib binary-data ld

8
推荐指数
1
解决办法
3727
查看次数

当nm找不到符号时,处理"dyld:惰性符号绑定失败:未找到符号"错误

我有一个胖(32位和64位)英特尔二进制文件myBinary,无法在运行Mac OS X 10.8.2的另一个工作站上运行:

$ myBinary
dyld: lazy symbol binding failed: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
  Referenced from: /usr/local/bin/myBinary
  Expected in: /usr/lib/libstdc++.6.dylib

dyld: Symbol not found: __ZNSt8__detail15_List_node_base7_M_hookEPS0_
  Referenced from: /usr/local/bin/myBinary
  Expected in: /usr/lib/libstdc++.6.dylib

Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)

我是从运行GCC 4.7.2的Mac OS X 10.8.2工作站编译的:

$ gcc --version
gcc (MacPorts gcc47 4.7.2_2+universal) 4.7.2
Run Code Online (Sandbox Code Playgroud)

我跑nm了,符号未定义:

$ nm /usr/local/bin/myBinary | grep __ZNSt8__detail15_List_node_base7_M_hookEPS0_
     U __ZNSt8__detail15_List_node_base7_M_hookEPS0_
Run Code Online (Sandbox Code Playgroud)

编译时我错过了什么或做错了什么myBinary?我不知道我能做些什么来丢失符号/usr/lib/libstdc++.6.dylib- 我应该将C++库静态编译成myBinary

macos gcc dylib libstdc++ osx-mountain-lion

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