假设我有一个大型库 liblarge,以及链接到 liblarge 的应用程序。
Liblarge 在 LGPL 许可下,而应用程序在专有许可下。我希望能够从 liblarge 中删除app 中未使用的所有“死代码” 。我能以某种方式做到这一点吗?也许向链接器提供一个使用函数的列表?
没有简单的方法让您继续。
您可以在私有副本上使用上述技术(在我的评论中)来锻炼,您可以删除 *.o。然后,您可以构建自己的修改后的 liblarge 源代码树,该源代码树构建 DSO/DLL,但在您确定不需要之后从链接器命令行(用于构建 DSO/DLL)中删除 *.o。
这就是 C/C++ 的工作原理,一旦代码转换为目标代码,就会丢失大量信息。
例如,您可能希望尝试减小每个 *.o 文件的大小。这样做的主要方法是拆分.c/ .cpp 编译单元。
C/C++ ABI 的问题是编译器可以自由地将代码放在 *.o 文件中的任何位置,然后使用相对偏移量跳入和跳出其中的段。*.o 中没有保存足够的元数据,无法分解编译后的代码并查看它运行所需的所有依赖项。为此,您需要手动拆分输入源代码。
这就是为什么对于嵌入式软件开发来说,当内存占用很重要时,您实际上会在源文件中放入一个函数。如今,嵌入式系统具有大量内存。