- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 SOVERSION
的文档出现时,我正在考虑对一个小型个人项目的共享库进行版本控制。 target 属性提到在 OS X 和 iOS 等 Mach-O 系统上,对应的是“兼容版本”,而 VERSION
对应于“当前版本”。
在 Linux 上,它只是类似于 VERSION 5.4.2
和 SOVERSION 5
表示该库与 5.0 及更新版本兼容,以及 VERSION
以 <major>.<minor>
形式用作 DLL 镜像版本在 Windows 上(我不确定 SOVERSION
在 Windows 上有什么区别)。
但是,the docs for the referenced FRAMEWORK
target property 中的示例说明您可能如何拥有 VERSION 16.4.0
和 SOVERSION 1.0.0
在 Mach-O 平台上(我对构建框架不感兴趣,只是想知道国外的版本控制方案。)
版本控制在 Mach-O 世界中是如何工作的?如果我删除某些功能,我习惯于只是撞主要版本,这将是兼容性中断,那么版本 16.4.0 的库怎么可能与该库的 1.0.0 版本保持兼容? “兼容”是什么意思?
最佳答案
首先,为了解决这个问题,框架只是名为 Something.framework/Something
的动态库。而不是 libsomething.dylib
.不过文件格式完全相同,所以在这篇文章中,我将简单地将它们称为 dylib。
现在,让我们从 mach-o/loader.h
的摘录开始 header (Mach-O 文件格式的事实上的权威来源):
/*
* Dynamicly linked shared libraries are identified by two things. The
* pathname (the name of the library as found for execution), and the
* compatibility version number. The pathname must match and the compatibility
* number in the user of the library must be greater than or equal to the
* library being used. The time stamp is used to record the time a library was
* built and copied into user so it can be use to determined if the library used
* at runtime is exactly the same as used to built the program.
*/
struct dylib {
union lc_str name; /* library's path name */
uint32_t timestamp; /* library's build time stamp */
uint32_t current_version; /* library's current version number */
uint32_t compatibility_version; /* library's compatibility vers number*/
};
/*
* A dynamically linked shared library (filetype == MH_DYLIB in the mach header)
* contains a dylib_command (cmd == LC_ID_DYLIB) to identify the library.
* An object that uses a dynamically linked shared library also contains a
* dylib_command (cmd == LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB, or
* LC_REEXPORT_DYLIB) for each library it uses.
*/
struct dylib_command {
uint32_t cmd; /* LC_ID_DYLIB, LC_LOAD_{,WEAK_}DYLIB,
LC_REEXPORT_DYLIB */
uint32_t cmdsize; /* includes pathname string */
struct dylib dylib; /* the library identification */
};
struct dylib
嵌入在库中以及针对它的二进制链接中,两者都包含
current_version
的副本。和
compatibility_version
.后者的工作原理在那里有解释,但前者不是地址。
dyld
上找到。手册页(来源是
here ,但在
man
之外不好看):
DYLD_VERSIONED_FRAMEWORK_PATH
This is a colon separated list of directories that contain potential override frame-
works. The dynamic linker searches these directories for frameworks. For each
framework found dyld looks at its LC_ID_DYLIB and gets the current_version and
install name. Dyld then looks for the framework at the install name path. Whichever
has the larger current_version value will be used in the process whenever a framework
with that install name is required. This is similar to DYLD_FRAMEWORK_PATH except
instead of always overriding, it only overrides is the supplied framework is newer.
Note: dyld does not check the framework's Info.plist to find its version. Dyld only
checks the -current_version number supplied when the framework was created.
[...]
DYLD_VERSIONED_LIBRARY_PATH
This is a colon separated list of directories that contain potential override
libraries. The dynamic linker searches these directories for dynamic libraries. For
each library found dyld looks at its LC_ID_DYLIB and gets the current_version and
install name. Dyld then looks for the library at the install name path. Whichever
has the larger current_version value will be used in the process whenever a dylib
with that install name is required. This is similar to DYLD_LIBRARY_PATH except
instead of always overriding, it only overrides is the supplied library is newer.
compatibility_version
用于确定库对于想要加载它的二进制文件是否“足够新”。 current_version
用于在有多个可用库时选择一个库。 16.4.0
的困惑兼容版本为
1.0.0
: 从看
some sources ,每当引入任何类型的功能时,Apple 似乎都会提升主要版本,并且使用次要版本几乎只修复错误,AFAIK。
16.4.0
,我可能会调用
1.16.4
. ;)
关于macos - Mach-O 平台上的库版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51940963/
我正在尝试手写 Mach-O 可执行文件。加载命令共有三个: LC_SEGMENT_64正在加载__PAGEZERO LC_SEGMENT_64 加载 __TEXT,带有单个 __text 部分 LC
从 objc 源代码我们可以看到 SEL 被定义为 typedef struct objc_selector *SEL; 我用 idaq 反汇编了我的 dylib ,我确实调用了 _MSHookMes
我正在尝试在 Mach 上的两个进程之间发送消息(准确地说,这是带有 Mach 微内核的 Debian GNU/Hurd),这是我的代码: #define _GNU_SOURCE #include
我对使用信号量感兴趣,它是使用 mach/semaphore.h 中的 semaphore_create(task, sem, policy, value) 创建的,在共享内存中用于在 Mac OS
我想在共享内存中使用匿名信号量来同步多个进程。 虽然多个 POSIX 操作系统提供匿名信号量(通过 sem_init 和相关函数),但 macOS 不支持它们。 我发现 Mach 信号量在 macOS
我正在尝试将 mach 端口传递给使用 fork 创建的子进程在 Mac OSX 上。我看到了这个问题 Sharing Mach ports with child processes但它没有解决方案,
构建应用程序时生成的 dsym 文件的结构是什么。我知道它包含 DWARF 调试信息,但什么是 dsym 文件。我想阅读其中的 DWARF 信息。 它只是一个只包含调试部分的 Mach-O 二进制文件
当 SOVERSION 的文档出现时,我正在考虑对一个小型个人项目的共享库进行版本控制。 target 属性提到在 OS X 和 iOS 等 Mach-O 系统上,对应的是“兼容版本”,而 VERSI
我正在尝试实现在项目中发现的openssl代码,但这些链接器错误并没有消失。我检查了框架是否正确链接,甚至使用../lib和../include手动包含了库和 header 搜索路径。尽管如此,当我摆
这个问题已经有答案了: Mach-O 64-bit format does not support 32-bit absolute addresses. NASM Accessing Array (1
我正在寻找有关如何设计 Mac OS X 网络内核扩展的特定部分以尽可能快速和高效的建议或指示 - C 语言。 描述:我有两套 TAILQ 列表。一个用于 A 型结构,另一个用于 B 型结构。大多数情
我有一个用 C++ 编写的服务器,它在 osx 上运行时会泄漏 Mach 端口。具体来说,运行时 top我注意到它有大约 50000(在 #PORTS 下)。奇怪的是,我让它运行了一夜,第二天机器基本
我修改了CoreData数据集,并向无错误的iPhone应用程序添加了两个新类。现在,当我尝试编译时,出现此错误: Apple Mach-OP Linker Error Linker command
我正在对 Mac OS X 上可用的不同 IPC 机制(管道、套接字、System V IPC 等)进行比较,我想看看 Mach 端口与更高级别的替代方案相比如何。但是,我遇到了一个非常基本的问题:跨
升级到Xcode 8.3.2后,尝试在设备上运行时,我收到了Apple Mach-O链接程序警告(它正在模拟器上运行)。但是我没有得到任何细节。双击该错误不会带来有关链接器警告的更多信息。有人可以帮忙
我有 2 张 table 。 表1 共有约 2700 行 列:ID、NO、NAME 表2: 共有约 300 行 列:ID、NAME 地点: Table1.NO = Table2.ID 我想列出 Tab
我在我的 iOS 应用程序中使用了一些第三方库(库有 flurry、chartboost 和burSTLy)。所有这些第三方库都有静态库,我通过将它们添加到“将二进制与库链接”中来将它们包含在我的项目
Undefined symbols for architecture x86_64: "_BFTaskMultipleExceptionsException", referenced from:
我正在尝试设置一条 mach 消息,以使用 mach IPC 发送越界的字符串。但是,在尝试发送越界消息时,我收到了 (ipc/send) invalid msg-header 错误。 这是消息结构。
为什么 SELECT * , MATCH(tags) AGAINST('php' IN BOOLEAN MODE) .. etc 不返回任何东西(而 php 标签存在于许多行中) 和 SELECT *
我是一名优秀的程序员,十分优秀!