将自定义 glibc 与 bazel 结合使用

Using custom glibc with bazel

我在非 root (debian) 环境中,在编译二进制文件时我得到了

Failed to open library! - ./libdmlab.so
dlopen: cannot load any more object with static TLS

我了解到这是一个比较常见的问题,并且在 glibc/2.21.1 中通过增加限制来规避。我现在正尝试在本地安装更新的 (2.22) 版本的 glibc 并 link 在 bazel 中使用它。

我已经从源代码编译了 glibc,并向 PATHCPATHLIBRARY_PATH 添加了适当的内容。将 glibc/lib 添加到 LD_LIBRARY_PATH 会造成 ldd 段错误,所以我将其删除。

接下来就是在bazel中使用本地安装的glibc的问题了。我尝试使用 -linkeropt(以及 -copt)作为:

bazel run --linkopt "-Wl,--rpath=/u/sygnowsj/bin/glibc -Wl,--dynamic-linker=/u/sygnowsj/bin/glibc/lib/ld-linux-x86-64.so.2" run //target

this answer 中所述,但它没有改变任何内容。我也尝试添加

"-Wl,--rpath=/u/sygnowsj/bin/glibc",
"-Wl,--dynamic-linker=/u/sygnowsj/bin/glibc/lib/ld-linux-x86-64.so.2",

BUILD 文件中有问题的库的 linkeropts,但它也没有帮助。

如何针对我的 glibc 版本针对所有目标制作 bazel link?我可以通过任何其他方式规避达到静态 TLS 限制的问题吗?

bazel run --linkopt "-Wl,--rpath=/u/sygnowsj/bin/glibc -Wl,--dynamic-linker=/u/sygnowsj/bin/glibc/lib/ld-linux-x86-64.so.2" run //target

这看起来不对:里面有两个 run。此外,将单个 -Wl,--rpath...ld-linux-x86-64.so.2 参数传递给链接器不会执行您想要的操作。您需要:

--linkopt=-Wl,--rpath=/u/sygnowsj/bin/glibc \
--linkopt=-Wl,--dynamic-linker=/u/sygnowsj/bin/glibc/lib/ld-linux-x86-64.so.2

或:

 --linkopt=-Wl,--rpath=/u/sygnowsj/bin/glibc,--dynamic-linker=/u/sygnowsj/bin/glibc/lib/ld-linux-x86-64.so.2

最后,您的 --rpath 值:/u/sygnowsj/bin/glibc 看起来不对。它应该是:

-Wl,--rpath=/u/sygnowsj/bin/glibc/lib

(因为那是你的 ld-linux 所在的地方)。