如何在运行解释语言二进制文件和其脚本时检查已链接的共享库?

我正在试图找到运行需要torch库的lua脚本所需的每个库

test.lua:

#!/usr/bin/env lua

print "欢迎使用LUA"
print('_VERSION = ' .. _VERSION)
require("nn") -- 这将加载torch nn库以在代码中进一步使用
print "加载通过"

输出:

欢迎使用LUA
_VERSION = Lua 5.1
加载通过

当我使用

lld ./lua
# 或者
lld ./lua test.lua

我得到以下输出:

ldd ./lua ../../../bin/test.lua
    linux-vdso.so.1 =>  (0x00007ffdba77d000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f160dd3e000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f160db3a000)
    libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f160d8f3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f160d52a000)
    /lib64/ld-linux-x86-64.so.2 (0x00005580e2ebd000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f160d301000)
../../../bin/test.lua:
    不是动态可执行文件

显然,torch nn使用的库在此处未显示。我们只看到“lua”程序所需的必要库

如果将“test.lua”文件制作为可执行文件并运行“ldd ./test.lua”,我得到以下输出

ldd ./test.lua
    不是动态可执行文件

如何在运行解释语言二进制文件和其脚本时检查已链接的库(.so)?(在Lua和Python中)

点赞
用户107090
用户107090

最有可能的是 Lua 在动态加载 nn。它会在 LUA_CPATHpackage.cpath 中寻找 nn

一个寻找被要求的库的方法是重新定义 require 函数:

local real_require=require
function require(x)
    print(x,package.searchpath(x,package.cpath))
    return real_require(x)
end
2016-11-28 17:41:38
用户2170527
用户2170527

你可以使用 LD_DEBUG

$ LD_DEBUG=all python tmp.py 2>&1 | grep 'generating link map'
3358:   file=libpthread.so.0 [0];  generating link map
3358:   file=libc.so.6 [0];  generating link map
3358:   file=libdl.so.2 [0];  generating link map
3358:   file=libutil.so.1 [0];  generating link map
3358:   file=libz.so.1 [0];  generating link map
3358:   file=libm.so.6 [0];  generating link map

请记住,如果你的应用程序只在特定事件上加载库,则在默认运行期间可能看不到它。

2016-11-28 18:37:19