我正在从放置在目录中的多个对象中创建一个静态库。 当我在最终创建的静态库上运行字符串时,我发现用于创建对象的 C 文件的名称及其相对路径也存在于输出中。
我不想暴露这些信息。 我在这里错过了什么? 我正在使用的命令是:
ar rcs myLib.a myobj1.o myobj2.o etc
我发现值得一提的是,我将这个库与我在下面添加的瘦存档方法的其他预构建库相结合
$(AR) cqT final_thin.a lib1.a lib2.a
echo -e 'create final.an addlib final_thin.a nsavenend' | $(AR) -M
帮助将不胜感激
您需要分 2 个步骤完成。
-
创建库的调试版本。始终使用可用的调试信息编译此版本。
-
创建库的发布版本。始终编译此版本,去除所有调试信息。
显然,调试信息可以帮助您调试软件(库(。其中一些信息是所有相关文件的路径 - 正如您注意到的那样。
当您实现/修复所有内容时,您可以构建不包含任何敏感信息的发布版本。
有关如何包含/排除调试信息的细节,您需要研究编译器的文档。如果它有一个图形界面,它可能会帮助你的努力。
当我在最终创建的静态库上运行字符串时,我发现用于创建对象的 C 文件的名称及其相对路径也存在于输出中。
此类信息至少有两个来源:
-
主要问题是编译器嵌入在目标文件中的调试信息。 这确实包括文件名和每个原始源文件的路径等。 通过在不使用调试信息和/或
strip
ping 对象调试信息来避免这种情况。 请注意,剥离调试信息将使调试更加困难,因为各种调试工具可以使用的信息将减少。 -
但你也提到你正在使用精简档案。 瘦存档绝对会包含目标文件的名称和路径,因为这是允许它精简的原因。"归档元素的路径是相对于归档本身存储的"(GNU
ar
手册页(。 请注意,精简存档的整个想法实际上不适合任何关心路径存在的场景。 它们提供了较小的构建时便利性,但不太适合分发或系统范围的安装。