当目标属性的文档SOVERSION提到在 OS X 和 iOS 等 Mach-O 系统上,它对应于“兼容版本”,而VERSION对应于“当前版本”时,我正在考虑对一个小型个人项目的共享库进行版本控制”。
在 Linux 上,它只是类似 和 的东西,VERSION 5.4.2表明SOVERSION 5该库与 5.0 及更高版本兼容,并在 Windows 上VERSION用作 DLL 映像版本<major>.<minor>(我不确定SOVERSION在 Windows 上有什么区别)。
然而,文档中引用的FRAMEWORK目标属性的示例说明了您在 Mach-O 平台VERSION 16.4.0上的可能方式SOVERSION 1.0.0(我对构建框架不感兴趣,只是想知道外部版本控制方案。)
Mach-O 世界中版本控制是如何工作的?我习惯于在删除某些功能时直接升级主要版本,这将导致兼容性中断,那么版本 16.4.0 的库怎么可能仍然与库的 1.0.0 版本兼容呢?“兼容”是什么意思?
我希望能够估算出我的C++程序使用了多少代码和静态数据?
有没有办法通过查看可执行文件或目标文件来找到它?或许我可以在运行时做些什么?
otool会帮忙吗?
py-macholib在osx上无法正常工作(使用darwin端口).我没有找到任何其他选择.
有任何想法吗?
我经常得到'otool'所示方法的实现地址的1字节偏移量.
例如'otool -o'给出0xe99d5,但'otool -tvV'给出:
+[NSError(SomeCategory) someMethod]:
000e99d4 b590 push {r4, r7, lr}
000e99d6 f6441184 movw r1, 0x4984
000e99da af01 add r7, sp, #4
000e99dc f2c0010a movt r1, 0xa
Run Code Online (Sandbox Code Playgroud)
所以方法从0xe99d4开始.0xe99d5看起来不对,没有对齐.我相信'otool'工作正常,我不了解实施的某些方面.如何解释输出?
当我在iOS 7.1中启动它时,我的应用程序崩溃,但在iOS 8.1中运行正常
我得到的错误是这样的:
dyld:未加载库:/System/Library/Frameworks/AVKit.framework/AVKit引用自:MY APP 原因:找不到合适的图像.找到:/System/Library/Frameworks/AVKit.framework/AVKit:mach-o,但错误的架构(lldb)
我也注意到了一个类似的错误,但是UIKit提到了一些编辑而不是AVKit.
有谁知道如何解决这个问题?我正在使用Xcode 6.1.
我真的不想错过iOS 7用户只发布iOS 8.谢谢!
我正在写一个ARMv7反汇编程序.在ARM参考手册中清楚地描述了在ARM和Thumb模式之间切换的方法,但是您如何知道程序的起始模式?
我使用Xcode默认编译为拇指,所以我知道我自己的所有程序都将在Thumb中启动,除非我强制编译为ARM模式.但是,我希望能够获取一个任意的mach-o可执行文件,并在代码的开头找出指令集模式.
mach-o标题中是否有某个地方指定入口点处的指令集?
我将我的项目从swift 3转换为swift 4并使用最新版本的xcode 9.在构建时,我收到以下错误:
Undefined symbols for architecture arm64:
"__T0So22AVCapturePhotoSettingsC12AVFoundation01_abC16SwiftNativeTypesACWP", referenced from:
__T06SpotMi8CameraVCC12capturePhotoyypF in CameraVC.o
"__T012AVFoundation39_AVCapturePhotoSettingsSwiftNativeTypesPAAE016availablePreviewc11PixelFormatG0SaySo8NSNumberCGfg", referenced from:
__T06SpotMi8CameraVCC12capturePhotoyypF in CameraVC.o
ld: symbol(s) not found for architecture arm64
我没有线索.任何帮助都感激不尽.
干杯!
假设我有一个 .a fat 库,它是为多种架构(例如 armv7、armv7s、i386、x86_64、arm64)构建的。库是为 iOS 构建的(其中包含 cmd LC_VERSION_MIN_IPHONEOS 和 6.0 版)。例如,当我运行$ otool -lv 时,我会得到带有此类加载命令的部分:
Load command 1
cmd LC_VERSION_MIN_IPHONEOS
cmdsize 16
version 6.0
sdk n/a
Run Code Online (Sandbox Code Playgroud)
我想将其替换为:
Load command 1
cmd LC_VERSION_MIN_TVOS
cmdsize 16
version 9.0
sdk n/a
Run Code Online (Sandbox Code Playgroud)
有人知道我该怎么做或可以指出一些有用的资源吗?我还能在 tvOS 上链接修改后的库吗?
如何查看有关 MacOS 二进制文件的一些基本信息,特别是用于构建它的内容、链接的框架以及它使用的系统调用?
我试过了nm,otool -L但他们的输出只是部分有用。
例如,什么表明二进制文件是使用 xcode 或 golang 编译器构建的?
注意。我对逆向工程 macos 二进制文件不感兴趣。我只想使用已包含在 OOTB 中的工具更好地了解我的系统上运行的内容。
我正在尝试编写一个没有 main 的 C++ 程序。是否可以将 mach-o 可执行文件的入口点更改为自定义函数(除了main())?
如果没有,那么,是否可以在main调用实际的 C 之前包装以调用我的 main 版本main?
编辑:
我想我的自定义函数调用 C main。如果我给它一个构造函数属性或将它添加到 ctor 列表,那么main将被调用两次。我不希望这种情况发生。
PS 我正在 Mac OS X High Sierra 中使用 clang 版本 9.1.0 构建可执行文件