Xcode 链接器可以删除合并二进制文件中的重复符号吗?

问题描述 投票:0回答:1

简介

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

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

项目设置

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

  1. 静态库名为
    StaticLibrary
    。它:
    • 包含一个名为
      SLClass1
    • 的 Objective-C 类
  2. 第一个动态框架目标名为
    DynamicFramework1
    。它:
    • 包含一个名为
      DF1Class1
      的 Objective-C 类,它调用
      SLClass1
      ;和
    • 具有
      MERGEABLE_LIBRARY
      构建设置值为
      YES
  3. 第二个动态框架目标名为
    DynamicFramework2
    。它:
    • 包含一个名为
      DF2Class1
      的 Objective-C 类,它调用
      SLClass1
      ;和
    • 具有
      MERGEABLE_LIBRARY
      构建设置值为
      YES
  4. 应用程序目标名为
    App
    。它:
    • 包含一个名为
      ViewController
      的 Swift 类,它调用
      DF1Class1
      DF2Class1
      类;和
    • 具有
      MERGED_BINARY_TYPE
      构建设置值为
      Automatic
      1

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

预期结果

合并的应用程序二进制文件在发布模式下构建时,直接包含

DF1Class1
DF2Class1
SLClass1
的符号,并且仅包含每个符号的一个实例(即没有重复项)。

我的这一期望基于 WWDC 2023 演讲中的 可合并库的好处 部分,演讲者说:

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

实际结果

合并的应用程序二进制文件在发布模式下构建时,直接包含

DF1Class1

DF2Class1
SLClass1
的符号,但它包含
SLClass1
符号的两个实例(即包含重复项)。
2
我的问题

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

脚注

1我也尝试过使用MERGED_BINARY_TYPE构建设置值
Manual
,但结果是相同的。
2
我通过在应用程序的可执行文件上运行 nm 命令并检查输出来验证这一点。
    
xcode static-linking dynamic-linking xcode-mergeable-libraries
1个回答
0
投票
answer

,可合并库概念并不能解决我的问题。主要原因是此功能的行为类似于静态链接器,这可以有效地导致两种行为:

如果公共代码对链接器不可见,则无法进行合并。
  1. 如果公共代码对链接器可见,您将收到重复符号错误。
  2. 不幸的是,以上解决方案都不是我所需要的。

© www.soinside.com 2019 - 2024. All rights reserved.