使用Bazel cc_binary()规则控制--whole-archive的使用

时间:2017-08-29 13:58:19

标签: bazel

我想在使用cc_binary()规则链接共享库(.so)时控制-whole-archive的使用。

我使用cc_binary()规则创建共享库的原因与此线程有关:https://groups.google.com/forum/#!topic/bazel-discuss/NG4N84ar3BY

我有一个 liba.a ,它包含两个函数实现:a(),a1(),它们在单独的目标文件中实现并存档为一个.a文件。 代码如下:

交流转换器

void a() {
    puts("a");
}

a1.c

void a1() {                                                
    d();                                                   
}

构建文件

cc_library(                                                
    name = 'a',                                            
    srcs = [ 'liba.a' ],                                   
    hdrs = [ 'a.h' ],                                      
    linkstatic = True,                                     
)

我想构建一个依赖(链接)上述库的共享库:

b.c

void b() {
    a();
    puts("b");
}

构建文件

cc_binary(                                                 
    name = 'libb.so',                                      
    srcs = [ 'b.c' ],                                      
    deps = [ ':a' ],                                       
    linkshared = True,                                     
)

我想要实现的是以这样的方式链接 libb.so ,它只使用liba.a作为必需的符号,在这种情况下它应该只需要ao对象和链接它进入 libb.so

我无法做到这一点。在构建时,Bazel将使用-whole-archive作为liba.a,这将导致包含a1()的实现,当它根本不需要时。

如果未使用-whole-archive,则会生成正确的libb.so,并且没有a1()符号。

这一点很重要,现在libb.so使用-whole-archive时会导致d()无依赖地依赖。

这是运行bazel build libb.so -s的链接命令的片段输出:

>>>>> # //:libb.so [action 'Linking libb.so']
(cd /bazel/jbasila/_bazel_jbasila/9ad84409935838f6b01d4c9936deda53/execroot/__main__ && \
  exec env - \
    PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/jbasila/tools/bin:/home/jbasila/tools/git-tools:/home/jbasila/.local/bin:/home/jbasila/bin:/home/jbasila/tools/bin:/home/jbasila/tools/git-tools:/home/jbasila/tools/bin:/home/jbasila/tools/git-tools:/home/jbasila/.local/bin:/home/jbasila/bin \
    PWD=/proc/self/cwd \
  /usr/bin/gcc -shared -o bazel-out/local-fastbuild/bin/libb.so '-fuse-ld=gold' -Wl,-no-as-needed -Wl,-z,relro,-z,now -B/usr/bin -B/usr/bin -pass-exit-codes -Wl,-S -Wl,@bazel-out/local-fastbuild/bin/libb.so-2.params)

文件bazel-out/local-fastbuild/bin/libb.so-2.params的内容:

-whole-archive
bazel-out/local-fastbuild/bin/_objs/libb.so/b.pic.o
-no-whole-archive
-whole-archive
liba.a
-no-whole-archive
-lstdc++
-lm

那么再问一个问题,是否有办法让Bazel放弃-whole-archive使用liba.a

1 个答案:

答案 0 :(得分:1)

您可以使用--nolegacy_whole_archive禁用为共享库的依赖项设置整个存档。 https://docs.bazel.build/versions/master/command-line-reference.html中有一个简短的解释。