【问题标题】:How to change default dynamic library search path for libasan如何更改 libasan 的默认动态库搜索路径
【发布时间】:2017-03-06 00:40:31
【问题描述】:

我有一个应该在各种平台上运行的应用程序,即 ARM、i386、amd64 等。我想检查任何可能的内存泄漏,我在 GCC 中启用了地址清理程序 -fsanitize=address 我们正在使用 buildroot 来编译整个 OS+Application。为确保每个开发者安装相同版本的库,我们将所有需要的动态库打包在ProjectX/lib 路径并将其设置为 LD_LIBRARY_PATH。 如果地址清理程序关闭,一切正常。在使用 address-sanitizer 编译并运行应用程序时给出

/lib/i386-linux-gnu/libm.so.6: version `GLIBC_2.23' not found (required   by BUILD/host_shared_0_1/host/usr/i686-buildroot-linux-gnu/lib/libasan.so.1)

`GLIBC_2.23' 已经存在,但打包在 $ProjectX/lib 下 但是,libasan 在 /lib/i386-linux-gnu/ 下查找它,并在找到不兼容的版本时抛出错误。

QS:如何指示 libasan 仅在 LD_LIBRARY_PATH 指定的路径中查找所需的库。

【问题讨论】:

    标签: c++ c++11 gcc address-sanitizer


    【解决方案1】:

    您的 buildroot 和实际运行时环境似乎是二进制不兼容的,即 libasan 需要的 libm 版本 比安装在环境中的版本。这本身不是 Asan 的问题,二进制不兼容也可能会导致其他软件出现问题。详情请谷歌“未找到版本 GLIBC_2.23”。

    如何指示 libasan 在路径中查找所需的库 仅由 LD_LIBRARY_PATH 指定。

    这就是它现在所做的。

    【讨论】:

    • 所以你的意思是说如果我安装了 GLIBC_2.17 并使用 GLIBC_2.24 编译程序,即使我在动态库路径中提供 GLIBC_2.24,它仍然是二进制不兼容的?我想将 GLIBC 视为 boost 或 openCV 库。无论我在本地安装了哪个版本,只要我在 LD_LIBRARY_PATH 中提供正确的版本,二进制文件总是可以工作的!提前感谢您的帮助
    • > 所以你的意思是说如果我安装了 GLIBC_2.17 并且我使用 GLIBC_2.24 编译了一个程序,即使我在动态库路径中提供 GLIBC_2.24 它仍然是二进制不兼容的?
    • “即使我在动态库路径中提供 GLIBC_2.24,它仍然是二进制不兼容的” - 如果启用 GLIBC_2.24 的 libc.so 在 LD_LIBRARY_PATH 中的旧 GLIBC-2.17 libc.so 之前,这应该可以工作.但在您的情况下,似乎 ProjectX/lib 中缺少 libm.so.6 或 LD_LIBRARY_PATH 中的路径不正确,因为动态链接器无法找到 GLIBC_2.24 版本,而是加载旧的不兼容 /lib/i386-linux-gnu/libm .so.6.
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多