【问题标题】:How to remove path to C files and other meta data from static library如何从静态库中删除 C 文件和其他元数据的路径
【发布时间】:2019-09-04 11:38:12
【问题描述】:

我正在从跨目录放置的多个对象中创建一个静态库。 当我在最终创建的静态库上运行字符串时,我发现用于创建对象的 C 文件的名称及其相对路径也出现在输出中。

我不想公开这些信息。 我在这里想念什么? 我使用的命令是:

ar rcs myLib.a myobj1.o myobj2.o etc

我发现值得一提的是,我将这个库与我使用下面添加的瘦存档方法的其他预建库结合起来

$(AR) cqT final_thin.a lib1.a lib2.a

echo -e 'create final.a\n addlib final_thin.a \nsave\nend' | $(AR) -M

帮助将不胜感激

【问题讨论】:

  • Strip 库中的所有调试信息?请注意,调试库将非常困难。
  • 存档本身通常只存储纯目标文件名,没有路径前缀,即使您在将目标文件添加到库时提供了一个。该信息来自目标文件的编译。为什么要删除调试信息?
  • @JonathanLeffler 是的,这就是我想要实现的。 .

标签: c static-libraries unix-ar


【解决方案1】:

您需要分两步完成。

  1. 创建库的调试版本。始终使用可用的调试信息编译此版本。

  2. 创建库的发布版本。始终编​​译此版本,去除所有调试信息。

显然,调试信息可以帮助您调试软件(库)。其中一些信息是所有相关文件的路径 - 与您注意到的完全一样。

当您实现/修复所有内容后,您可以构建发布版本,其中不包含任何敏感信息。


关于如何包含/排除调试信息的细节,你需要研究你的编译器的文档。如果它有图形界面,它可能会帮助你。

【讨论】:

    【解决方案2】:

    当我在最终创建的静态库上运行字符串时,我发现用于创建对象的 C 文件的名称及其相对路径也出现在输出中。

    此类信息至少有两个来源:

    1. 主要是编译器嵌入到目标文件中的调试信息。这确实包括每个原始源文件的文件名和路径等。通过在没有调试信息的情况下进行编译和/或通过stripping 来自对象的调试信息来避免这种情况。请注意,剥离调试信息会使调试更加困难,因为各种调试工具可以使用的信息较少。

    2. 但您还提到您正在使用精简档案。精简档案绝对会包含目标文件的名称和路径,因为这就是精简档案的原因。 “档案元素的路径是相对于档案本身存储的”(GNU ar man page)。请注意,精简存档的整个想法确实不适合您关心路径存在的任何场景。它们提供了较小的构建时间便利,但不太适合分发或系统范围的安装。

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多