我想用一些代码修补一块废弃软件.
该软件是基于碳的,所以我不能使用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部分......
有人有主意吗?
我目前正在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中最好/最优雅/最容易做的事情吗?
我正在编写一个图形应用程序,使用Objective-C作为前端,使用C++进行图形处理和网络通信.我在Apple的网站上阅读,寻找一种方法将.dylib或.so与我的C++代码链接到我的Xcode项目,但似乎没有任何效果.我能够让项目引用它并链接它,但当我试图从.dylib调用函数时,它说它不知道我想要做什么.有谁知道这里发生了什么?
我知道Objective-C有我需要做的图形和网络所有的库,但我只是觉得这样做.我有一段时间没有做太多的C++,我想学习更多的Objective-C,那么有什么比一起使用它们更好的方法呢?
谢谢,罗比
我有一个动态库,我加载使用dlopen()然后卸载使用dlclose();
如果我不包含任何目标c代码dlopen()需要一个dlclose()预期行为的调用.但是当我将任何目标c代码包含在目标中时,我遇到的问题是我需要对dlclose()加载的库进行两次调用才能卸载.
这是预期的行为吗?我该如何解决?
我在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.
我们发现您最近交付的"AppName"存在一个或多个问题.要处理您的交付,必须纠正以下问题:
无效的捆绑包 - 您的应用程序引用的一个或多个动态库不在dylib搜索路径中.
一旦纠正了这些问题,您就可以重新更新已更正的二进制文件.
问候,
App Store团队
有没有办法调用从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) 我注意到strip -S -x在我的应用程序'Frameworks'文件夹中的二进制文件上运行(删除所有调试和所有本地符号)使它们缩小了约25%,即使我在构建设置中启用了调试符号的剥离.
另请注意,这使得Swift支持库也变得更小,并且看起来没有用于去除它们的构建设置.另外,我甚至不能100%确定我的"剥离调试符号"设置是否正确(即实际上导致调试符号被剥离),因为它nm --debug-syms仍然显示了大量符号,并且strip -S(删除调试符号表)仍然使它们变小.我的条带设置似乎是您在Internet上找到的推荐设置:
但运行是否有任何不良副作用strip -S -x,例如以后无法表示堆栈跟踪?
此外,如何在构建过程中自动执行此剥离,同时保持最终代码签名不变?似乎添加-Xlinker -x -Xlinker -S到我的"其他链接器标志"将此过程应用于当前项目的二进制文件(包括框架),但不应用于我的依赖项目中的框架(例如CocoaPods).这是特别相关的,因为相应地修改我包含的CocoaPods项目的构建设置并不容易.如上所述,它也与Swift支持库dylibs相关,它们也没有这样的链接器选项,但仍然受益于这种剥离.
我正在尝试将二进制文件编译为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:没有名称列表
二进制文件实际上是将下载到外部设备的固件.
谢谢你的期待
我有一个胖(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?