当我 运行 解释语言二进制文件及其脚本时,如何检查链接了哪些共享库?
How to check what shared libraries are linked when I run a interpreted language binary and its script?
我试图找到 运行 需要 torch 库的 lua 脚本实际需要的每个库
test.lua:
#!/usr/bin/env lua
print "Welcome to LUA"
print('_VERSION = ' .. _VERSION)
require("nn") -- this loads torch nn libraries to be further used in the code
print "Load pass"
输出:
Welcome to LUA
_VERSION = Lua 5.1
Load pass
当我使用
lld ./lua
# or
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:
not a dynamic executable
显然torch nn使用的库这里就不展示了。我们只看到 "lua" 程序
必需的库
如果将 test.lua
设为可执行文件并且我 运行 ldd ./test.lua
,我将得到以下输出
ldd ./test.lua
not a dynamic executable
当我 运行 解释语言二进制文件及其脚本时,如何检查链接了哪些库(或 .so)? (在 Lua 和 Python 中)
很可能 Lua 正在动态加载 nn
。它在 LUA_CPATH
或 package.cpath
.
中寻找 nn
查找需要哪些库的一种方法是重新定义 require
:
local real_require=require
function require(x)
print(x,package.searchpath(x,package.cpath))
return real_require(x)
end
您可以使用 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
请记住,如果您的应用仅在特定事件时加载库,您可能在默认情况下看不到它 运行。
我试图找到 运行 需要 torch 库的 lua 脚本实际需要的每个库
test.lua:
#!/usr/bin/env lua
print "Welcome to LUA"
print('_VERSION = ' .. _VERSION)
require("nn") -- this loads torch nn libraries to be further used in the code
print "Load pass"
输出:
Welcome to LUA
_VERSION = Lua 5.1
Load pass
当我使用
lld ./lua
# or
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:
not a dynamic executable
显然torch nn使用的库这里就不展示了。我们只看到 "lua" 程序
必需的库如果将 test.lua
设为可执行文件并且我 运行 ldd ./test.lua
,我将得到以下输出
ldd ./test.lua
not a dynamic executable
当我 运行 解释语言二进制文件及其脚本时,如何检查链接了哪些库(或 .so)? (在 Lua 和 Python 中)
很可能 Lua 正在动态加载 nn
。它在 LUA_CPATH
或 package.cpath
.
nn
查找需要哪些库的一种方法是重新定义 require
:
local real_require=require
function require(x)
print(x,package.searchpath(x,package.cpath))
return real_require(x)
end
您可以使用 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
请记住,如果您的应用仅在特定事件时加载库,您可能在默认情况下看不到它 运行。