在 Bazel 中创建完全静态的 C++ 二进制文件

cjd*_*jds 5 c++ gcc bazel

是否可以在 Bazel 中创建完全静态的二进制文件,或者 GCC 或 Bazel 是否存在阻止我的错误?

这是我得到的错误

/bin/ld.gold: error: /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginT.o: requires dynamic R_X86_64_32 reloc against '__TMC_END__' which may overflow at runtime; recompile with -fPIC
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的话,这是一个非静态链接的 libstdc++ 版本。想知道是否有一个静态链接的 libstdc++ 版本可供 Bazel 使用。

尝试在 Bazel 的存储库上查看此问题,但提到的解决方法对我不起作用

https://github.com/bazelbuild/bazel/issues/8672

信息转储

  • 巴泽尔版本:3.3.1
  • GCC版本:gcc(Ubuntu 9.3.0-17ubuntu1~20.04)9.3.0
  • 操作系统:Docker 容器中的 Ubuntu 20.04

我的构建文件

cc_binary(
  name = "main",
  srcs = ["main.cpp"],
  linkshared=True,
  copts = ["-shared", "-fpic", "-fPIC"],
  features = ["fully_static_link"],
)
Run Code Online (Sandbox Code Playgroud)

主程序

int main()
{
  return 1;
}

Run Code Online (Sandbox Code Playgroud)

其他版本的构建文件具有类似的结果

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    linkshared=True,
    linkstatic=1,
    linkopts = ["-static"]
)

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    linkshared=True,
    linkstatic=1,
    linkopts = ["-static"],
    features = ["fully_static_link"],
    copts=["-fpic"],
)
Run Code Online (Sandbox Code Playgroud)

长话短说

Bazel 不会在 Ubuntu 20.04、GCC 9.3.0 中编译完全静态的二进制文件。我想了解发布的问题是否相关,或者我是否不了解静态链接的某些内容?