使用Bazel cc_binary()规则控制--整个归档文件的使用

使用Bazel cc_binary()规则控制--整个归档文件的使用,bazel,Bazel,使用cc_binary()规则链接共享库(.so)时,我想控制-whole archive的使用 我使用cc_binary()规则创建共享库的原因与此线程有关: 我有一个liba.a,它包含两个函数实现:a(),a1(),它们在单独的对象文件中实现,并归档到一个.a文件中。 代码如下: a.c void a() { puts("a"); } void a1() { d();

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

我使用cc_binary()规则创建共享库的原因与此线程有关:

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

a.c

void a() {
    puts("a");
}
void a1() {                                                
    d();                                                   
}
void b() {
    a();
    puts("b");
}
a1.c

void a() {
    puts("a");
}
void a1() {                                                
    d();                                                   
}
void b() {
    a();
    puts("b");
}
生成文件

cc_library(                                                
    name = 'a',                                            
    srcs = [ 'liba.a' ],                                   
    hdrs = [ 'a.h' ],                                      
    linkstatic = True,                                     
)
cc_binary(                                                 
    name = 'libb.so',                                      
    srcs = [ 'b.c' ],                                      
    deps = [ ':a' ],                                       
    linkshared = True,                                     
)
我想建立一个共享库,该库依赖于(链接)上述库:

b.c

void a() {
    puts("a");
}
void a1() {                                                
    d();                                                   
}
void b() {
    a();
    puts("b");
}
生成文件

cc_library(                                                
    name = 'a',                                            
    srcs = [ 'liba.a' ],                                   
    hdrs = [ 'a.h' ],                                      
    linkstatic = True,                                     
)
cc_binary(                                                 
    name = 'libb.so',                                      
    srcs = [ 'b.c' ],                                      
    deps = [ ':a' ],                                       
    linkshared = True,                                     
)
我想要实现的是链接libb.so,这样它将只使用liba.a作为所需的符号,在这种情况下,它应该只需要a.o对象并将其链接到libb.so

我不能让这一切发生。构建时,Bazel将使用liba.a的
-whole archive
,这将导致包含
a1()
的实现,而这完全不是必需的

如果未使用
-整个存档
,则生成的libb.so将正确构建,并且不会出现
a1()
符号

这一点之所以重要,是因为现在
libb。因此
在使用
-整个归档文件时
会无缘无故地导致对
d()
的依赖

这是运行
bazel build libb.so-s
得到的linkage命令的代码段输出:

>>>>> # //: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放弃对liba.a使用
-whole archive

您可以使用
--nolegacy\u whole\u archive
来禁用为共享库的依赖项设置整个归档。有一个简短的解释。

但我不确定这对我有多大帮助。我需要能够控制哪些依赖项应该是一个完整的归档,哪些不是从最终目标的角度。如果我有两条规则,一条是将liba.a作为一个整体归档,另一条是需要与liba.a链接,而不是将其作为一个整体归档,那么我不确定我是如何做到的。alwayslink将控制库是否是依赖于所述库的所有目标的完整存档。有没有办法控制它?你需要两个不同的目标。在实现之前,它不会很好地工作。除了以下攻击:如果将.a文件重命名为.lo,它将作为整个存档链接。我们还考虑将WholerChive应用于边缘,而不是节点(例如,通过具有“完整存档”属性),但短期内未计划该工作。