从静态库中去除不需要的符号

我有一组来自第三方的绝对庞大的.a文件。 我有我自己的库,从这套库调用5或6个函数。 我想生成一个更小的.a文件,其中包括我的代码和(less数)依赖关系在外部库中。

具体来说:

我拥有的

  1. external.h

    int foo(); int bar(); 
  2. libexternal.a

     0000000000000000 T foo() 0000000000000010 T bar() 
  3. mylibrary.c

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

     int foo_wrapper(); 

我想要的是

我想创build一个文件libmylibrary.a ,它具有符号foo_wrapper ,它的依赖关系foo ,以及任何foo内部调用,但不是bar (实际上代表数以千计的函数)。 这样,人们可以包含我的库,而不必在libexternal.a包含external.h或链接。 我不愿意手动列出foo因为实际上有一大堆function。

可以这样做吗?

更多详情

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

就像KevinDTimm所说:你可以使用“ar”编辑你的.a文件来提取其中的所有对象文件,并将必要的文件添加回.a文件。

图书馆的作者可以把他的所有功能放在一个.c文件或多个文件中。 每个.c文件产生一个目标文件。

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

另外你的最终的程序将包含被“存档”到你的链接.a静态库中的obj文件的一个子集。 但是每个单个的obj文件要么完全不能运行,要么完全不运行!

你需要的是ar ,* nix的存档程序;

为了您的所有需求,请看这里 (或者只输入man ar

简短的回答,你正在寻找“T”选项来查看,“X”选项从库中提取对象和“R”选项选项来添加它们。

请注意,可能(将)会有很多相互依赖性,需要相当长的一段时间才能确定。