将自定义 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,并向 PATH
、CPATH
和 LIBRARY_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
所在的地方)。
我在非 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,并向 PATH
、CPATH
和 LIBRARY_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
所在的地方)。