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

E_G*_*E_G 6 linux static-libraries

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

具体来说:

是)我有的

  1. external.h

    int foo();
    int bar();
    
    Run Code Online (Sandbox Code Playgroud)
  2. libexternal.a

    0000000000000000 T foo()
    0000000000000010 T bar()
    
    Run Code Online (Sandbox Code Playgroud)
  3. mylibrary.c

    #include "external.h"
    int foo_wrapper() { return foo(); }
    
    Run Code Online (Sandbox Code Playgroud)
  4. mylibrary.h

    int foo_wrapper();
    
    Run Code Online (Sandbox Code Playgroud)

我想要的是

我想创建一个文件libmylibrary.a,其中包含符号foo_wrapper,依赖关系foo以及foo内部调用的任何内容,但不是bar(实际上代表数千个函数).通过这种方式,人们可以在不必包含external.h或链接的情况下包含我的库libexternal.a.我不愿意手动列出,foo因为实际上有很多功能.

可以吗?

更多详情

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

Chr*_*ian 4

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

该库的作者可以将其所有函数放入单个 .c 文件或多个文件中。每个 .c 文件都会生成一个目标文件。

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

此外,您的最终程序将包含“存档”到链接的 .a 静态库中的 obj 文件的子集。但是每个 obj 文件要么完全在您的最终可执行文件中,要么根本不存在!