【问题标题】:Using custom glibc with bazel将自定义 glibc 与 bazel 一起使用
【发布时间】:2017-09-30 05:33:48
【问题描述】:

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

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

我了解到这是一个比较常见的问题,并在 glibc/2.21.1 中通过增加限制来规避。我现在正在尝试在本地安装更新的 (2.22) 版本的 glibc 并在 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 链接?我可以通过其他方式规避达到静态 TLS 限制的问题吗?

【问题讨论】:

    标签: c linker glibc bazel thread-local-storage


    【解决方案1】:

    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

    这看起来不对:你有两个runs。此外,将单个 -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 所在的位置)。

    【讨论】:

    • 谢谢。事实证明,我与 glibc 正确链接,但错误位于其他地方。
    猜你喜欢
    • 2016-11-04
    • 2017-07-04
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多