I was building a shared/dynamic library by using bazel
. The rules in Build
file are like below
cc_library(
name = "a",
srcs = ["a.cc"]
)
filegroup(
name = "vis_ld",
srcs = ["tool/vis.ld"]
)
cc_library(
name = "b",
hdrs = ["b.h"],
srcs = ["b.cc"],
deps = [":a"],
)
cc_binary(
name = "libgeta.so",
deps = [":b"],
linkshared = True,
linkopts = [
"-Wl,--version-script,","$(location :vis_ld)"
],
data = [":vis_ld"]
)
The libgeta.so
is target binary file. As we known from the rule, there exists a version script file that limits the exported symbols. Here's the wired thing, if I built libgeta.so
locally, it works fine. When I tried to build with bazel cluster, it fails with following error.
/opt/rh/devtoolset-7/root/usr/bin/ld.gold: error: cannot open tool/vs.ld: No such file or directory
/opt/rh/devtoolset-7/root/usr/bin/ld.gold: fatal error: unable to parse version script file tool/vs.ld
collect2: error: ld returned 1 exit status
the bazel version I was using is 0.24.1
.
It has confused me for days, please help. Thanks!
I tried to generate vs.ld
file with Rule genrule
at compile-time, but it does not work.
The version script needs to go into the deps
attribute of the cc_binary
rather than data
.
(Also, Bazel 0.24.1 is very old.)