如果您已经在可执行二进制文件上使用了上面的file命令,则不能错过输出中的“动态链接”消息。 这是什么意思?
开发软件时,我们尽量不要重新发明轮子。 大多数软件程序需要执行一组通用任务,例如打印输出或从标准文件中读取或打开文件等。所有这些通用任务都通过一组通用函数抽象出来,每个人都可以使用它们代替编写自己的变体。 这些常用功能放在名为libc或glibc的库中。
如何找到可执行文件所依赖的库? 这就是ldd命令出现的地方。 针对动态链接的二进制文件运行它会显示其所有依赖的库及其路径。
$ ldd /bin/ls
linux-vdso.so.1 => (0x00007ffef5ba1000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fea9f854000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fea9f64f000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fea9f446000)
libc.so.6 => /lib64/libc.so.6 (0x00007fea9f079000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fea9ee17000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fea9ec13000)
/lib64/ld-linux-x86-64.so.2 (0x00007fea9fa7b000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fea9ea0e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fea9e7f2000)

跟踪

它的作用:库调用跟踪器。
现在,我们知道如何使用ldd命令查找可执行程序所依赖的库。 但是,一个库可以包含数百个函数。 在这数百种中,二进制文件实际使用的功能是什么?
ltrace命令显示在运行时从库中调用的所有函数。 在下面的示例中,您可以看到调用的函数名称以及传递给该函数的参数。 您还可以在输出的最右侧看到这些函数返回的内容。
$ ltrace ls
__libc_start_main(0x4028c0, 1, 0x7ffd94023b88, 0x412950
strrchr("ls", '/') = nil
setlocale(LC_ALL, "") = "en_US.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"
textdomain("coreutils") = "coreutils"
__cxa_atexit(0x40a930, 0, 0, 0x736c6974756572) = 0
isatty(1) = 1
getenv("QUOTING_STYLE") = nil
getenv("COLUMNS") = nil
ioctl(1, 21523, 0x7ffd94023a50) = 0