linux – 从静态库中删除不需要的符号

前端之家收集整理的这篇文章主要介绍了linux – 从静态库中删除不需要的符号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有来自第三方的一组绝对庞大的.a文件.我有自己的库,只从这组库中调用5或6个函数.我想生成一个小得多的.a文件,其中包含我的代码及其(少量)依赖项在外部库中.

具体来说:

 是)我有的

> external.h

int foo();
int bar();

> libexternal.a

0000000000000000 T foo()
0000000000000010 T bar()

> mylibrary.c

#include "external.h"
int foo_wrapper() { return foo(); }

> mylibrary.h

int foo_wrapper();

 我想要的是

我想创建一个文件libmylibrary.a,它包含foo_wrapper的符号,它的依赖关系foo,以及foo内部调用的任何东西,但不是bar(实际上代表数千个函数).这样,人们可以包含我的库,而不必在libexternal.a中包含external.h或link.我不愿意手动列出foo,因为实际上有很多功能.

可以吗?

 更多详情

我愿意列出我需要的符号.所以例如,我可以在命令行上指定foo_wrapper.但是我也不能在命令行上指定foo,以及它调用的任何函数.我可以指定foo_wrapper的原因是它允许我编写一个名为callEverything()的函数,该函数调用我想要提供的所有函数,然后将该符号放在命令行上.

最佳答案
像KevinDTimm所说:你可以使用“ar”编辑.a文件,以提取其中的所有目标文件,并将必要的文件添加回.a存档.

该库的作者可以将他的所有功能放在单个.c文件或多个文件中.每个.c文件都会生成一个目标文件.

我认为你没有机会只占用目标文件的一部分,你需要全部或全部.在链接时,将.obj文件再次分离到它的函数中为时已晚:有太多直接嵌入的地址和函数调用.

此外,您的最终程序将包含obj文件的一个子集,这些文件被“存档”到您链接的.a静态库中.但是每个单独的obj文件要么完全在你的最终exectuable中,要么根本不在!

原文链接:https://www.f2er.com/linux/440735.html

猜你在找的Linux相关文章