什么是Linux的ldd在Windows上的等价物?
问题的简短版本: 如何让gdb使用libc的调试符号?
更长版本: 我正在使用gdb调试程序,我想查看有关libc使用的futex的信息.但是,在调试期间的某个时刻,我得到的输出如下:
Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ?? () from /lib/libc.so.6
(gdb) bt
#0 0x00007ffff772b73e in ?? () from /lib/libc.so.6
#1 0x00007ffff767fb90 in ?? () from /lib/libc.so.6
#2 0x00007ffff767a4c0 in vfprintf () from /lib/libc.so.6
#3 0x00007ffff768565a in printf () from /lib/libc.so.6
....
Run Code Online (Sandbox Code Playgroud)
当我info sharedlibrary
在断点处运行gdb时,我看到:
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007ffff7dddaf0 0x00007ffff7df6704 Yes (*) /lib64/ld-linux-x86-64.so.2
0x00007ffff7bc53e0 0x00007ffff7bd1388 Yes (*) /lib/libpthread.so.0
0x00007ffff79ba190 0x00007ffff79bd7d8 Yes (*) /lib/librt.so.1
0x00007ffff76538c0 0x00007ffff7766c60 Yes (*) …
Run Code Online (Sandbox Code Playgroud) 我创建了一个交叉编译的arm可执行文件.我想找到可执行文件的库依赖项.我正在使用ubuntu natty并安装了arm-linux-gnueabi工具链,它不包含ldd.有没有一个工具可以在linux中查看arm可执行文件库的依赖性.
由于使用Gentoo,经常会在更新程序与旧版本的库链接之后发生.通常,revdep-rebuild有助于解决这个问题,但这次它依赖于python库,并且python-updater
不会接受它.
是否有"分层"变体ldd
向我展示了共享库依赖于哪个共享库?大多数情况下,库和可执行文件仅与少数其他共享库链接,而这些共享库又与少数几个库链接,将库依赖项转换为大型列表.我想知道我使用我升级的另一个库的新版本重建哪个依赖项.
当我运行时,ldd program
我得到表单的输出
linux-gate.so.1 => (0xb77ae000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000)
libm.so.6 => /lib/libm.so.6 (0xb7691000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000)
libc.so.6 => /lib/libc.so.6 (0xb74c2000)
/lib/ld-linux.so.2 (0xb77af000)
Run Code Online (Sandbox Code Playgroud)
你能解释输出和原因,linux-gate.so.1
并以ld-linux.so.2
不同于其他条目的方式展示吗?他们的角色是什么?
我正在Linux上构建C++可执行文件.可执行文件链接到一些boost库.
这是我尝试运行二进制文件时的输出:
root@yourbox:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ./testfgci
./testfgci: error while loading shared libraries: libboost_system.so.1.45.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
然后我在二进制文件上运行ldd来检查依赖项:
root@yourbox:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ldd testfgci
linux-gate.so.1 => (0x00380000)
libboost_system.so.1.45.0 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00b50000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x005f6000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0099a000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x001b3000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00110000)
/lib/ld-linux.so.2 (0x00ea2000)
Run Code Online (Sandbox Code Playgroud)
我不确定为什么找不到liboos_system.sl.1.45.0 SO.我今天早些时候成功地建造了它.谁能解释一下?
我有一个libTest.so,在某些设备上没有加载.logcat绝对没用.使用arm-linux-androideabi-readelf.exe -d libTest.so
我能够看到libTest.so需要的所有必需的库.我将它们全部拉进我本地PC上的同一个文件夹中.
如何找出哪些符号丢失以及哪个库?我只有NDK的标准工具集(nm,readelf,objdump等).哪个工具以及如何使用它以便它解析我的libTest.so和所有依赖的libs并告诉我哪个符号阻止我的lib加载到目标设备上.
我正在尝试让我的软件在 macOS 上可用,在我的工具链中,我使用该ldd -r MyModel.so
命令来验证一切是否顺利,但我确实无法在 macOS 上找到具有相同行为的等效命令。
otool
和nm
似乎是两个方向,但是他们的哪个选项提供了 的行为ldd -r
?还有其他工具可以用于此目的吗?
我正在运行这两个命令,我得到不同的输出:
$ ldd `which ls`
linux-gate.so.1 => (0x00db3000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0x00ba2000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x007bf000)
libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0x004ce000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00398000)
/lib/ld-linux.so.2 (0x00dea000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00a83000)
libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0x00d3d000)
Run Code Online (Sandbox Code Playgroud)
然后
objdump -x `which ls` | grep NEEDED
NEEDED libselinux.so.1
NEEDED librt.so.1
NEEDED libacl.so.1
NEEDED libc.so.6
Run Code Online (Sandbox Code Playgroud)
那是怎么回事?我以为他们都给了库依赖?我关心的原因是我怀疑ldd
是正确的,但我正在使用ARM上的linux,那里没有我能说的ldd ......
[root@wdctc1281 bin]# ldd node
linux-vdso.so.1 => (0x00007fffd33f2000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f70f7855000)
librt.so.1 => /lib64/librt.so.1 (0x00007f70f764d000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f70f7345000)
libm.so.6 => /lib64/libm.so.6 (0x00007f70f7043000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f70f6e2d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f70f6c10000)
libc.so.6 => /lib64/libc.so.6 (0x00007f70f684f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f70f7a61000)
Run Code Online (Sandbox Code Playgroud)
第一行和最后一行是什么意思?它们看起来不像正常
xxxx.so => /lib64/xxxxx.so (0xxxxxxxxxxxxxxxxxxxx)
Run Code Online (Sandbox Code Playgroud)
格式.