Xcode 链接器是否可以对合并二进制文件中的符号进行重复数据删除?

Can the Xcode linker deduplicate symbols in a merged binary?

提问人:ale-gen 提问时间:11/10/2023 最后编辑:Adil Hussainale-gen 更新时间:11/17/2023 访问量:49

问:

介绍

我正在尝试确定 Xcode 的新可合并库功能是否可以在应用程序链接到两个动态框架的情况下删除重复的符号,这两个框架都链接到同一个静态库,如下所示:

|--App
  |--DynamicFramework1      
    |--StaticLibrary   
  |--DynamicFramework2      
    |--StaticLibrary <- the same library that DynamicFramework1 links to

项目设置

以下是有关应用结构的一些详细信息:

  1. 静态库名为 。它:StaticLibrary
    • 包含一个名为SLClass1
  2. 第一个动态框架目标被命名为 。它:DynamicFramework1
    • 包含一个名为 Objective-C 类的类,该类调用 ;和DF1Class1SLClass1
    • 具有 的生成设置值。MERGEABLE_LIBRARYYES
  3. 第二个动态框架目标名为 。它:DynamicFramework2
    • 包含一个名为 Objective-C 类的类,该类调用 ;和DF2Class1SLClass1
    • 具有 的生成设置值。MERGEABLE_LIBRARYYES
  4. 应用程序目标被命名为 。它:App
    • 包含一个名为 Swift 类的类,该类调用 and 类;和ViewControllerDF1Class1DF2Class1
    • 具有 的生成设置值。1MERGED_BINARY_TYPEAutomatic

在这里创建了一个具有上述结构的最小 Xcode 项目。

预期结果

合并的应用程序二进制文件在发布模式下构建时,包含 的符号,并直接在其中,并且仅包含每个符号的一个实例(即没有重复项)。DF1Class1DF2Class1SLClass1

我基于WWDC 2023 Meet mergeable libraries演讲中的“可合并库的好处”部分得出这一期望,演讲者说:

合并时,链接器可以跨所有库删除重复的内容,例如字符串。例如,它删除了冗余的符号引用、Objective-C 选择器和objc_msgsend存根。

实际结果

合并的应用程序二进制文件,在发布模式下构建时,包含 的符号,并直接在其中,但它包含 的两个实例 的符号(即它包含重复项)。阿拉伯数字DF1Class1DF2Class1SLClass1SLClass1

我的问题

我是否遗漏了应用的构建设置中的某些内容,或者我是否误解了可合并库的功能?我能否让 Xcode 链接器对 App 合并二进制文件中的符号进行重复数据删除?

脚注

1我也尝试过手动MERGED_BINARY_TYPE构建设置值,但结果是一样的。
2我通过在应用程序的可执行文件上运行 nm 命令并检查输出来验证这一点。
xcode 静态 动态链接 xcode-mergeable-libraries

评论


答:

0赞 ale-gen 11/17/2023 #1

Apple 的 Quinn “The Eskimo”(以他在 Apple 开发者论坛中的不懈支持而闻名)已经确认,在上述情况下,可合并库不会删除重复的符号。

有关详细信息,请在此处的 Apple 开发者论坛中查看他的回答。

评论

0赞 Adil Hussain 12/1/2023
我编辑了答案,使其读起来是对问题的完整答案,而不是附加信息。我投票赞成在编辑后取消删除它。