【问题标题】:What is a reliable way to determine which shared library will be loaded across linux platforms?确定跨 linux 平台加载哪个共享库的可靠方法是什么?
【发布时间】:2010-02-25 20:13:33
【问题描述】:

我需要在 /sbin/ldconfig 返回的信息中找出将加载哪个库。我想出了以下几点:

#!/bin/bash
echo $(dirname $(/sbin/ldconfig -p | awk "/$1/ {print \$4}" | head -n 1))

运行此结果:

$ whichlib libGL.so
/usr/X11R6/lib

这是一个两部分的问题:

  1. 这会产生跨平台的可靠结果吗?
  2. 有没有更巧妙的方法来解析 ldconfig 的输出?

谢谢, 保罗

【问题讨论】:

  • 你为什么不用ldd?它始终向您展示它将如何将流程链接在一起。
  • 我使用它作为输入来设置我的 LD_LIBRARY_PATH。该程序尚未构建,因此我无法使用 ldd。

标签: linux bash scripting shared-libraries


【解决方案1】:

可执行文件加载库的方式有多种: 1.

  1. 使用 $LD_LIBRARY_PATH
  2. 使用 ld 缓存
  3. 完整路径的库编译成二进制文件(-rpath gcc 标志)

您正在使用选项 2,而未考虑选项 1 和 3。

【讨论】:

    【解决方案2】:

    根据您的具体操作,您可能希望直接在您计划运行的可执行文件上运行ldd,而不是一般情况下的ldconfig

    既然你问了,你可以这样写你的脚本:

    dirname "$(/sbin/ldconfig -p | awk "\$1 == "$1" {print \$4; exit}")"
    

    它更精确一些,而且管道更少。 echo $(cmd) 也是多余的;你可以写cmd

    【讨论】:

    • 您的版本不接受命令行参数。在 OP 中,$1 是 Bash 参数,\$4 是 awk 字段。在您的中,$1$4 都是 awk 字段,并且正在搜索的库是硬编码的。
    • 哎呀,你是对的。我在命令行上测试时对其进行了硬编码。
    • 提醒一下,不要在不受信任的代码上使用 ldd:catonmat.net/blog/ldd-arbitrary-code-execution
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2015-04-20
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多