实用答案:大多数二进制文件是用“C”编写的,有些是用“C++”编写的。请参阅下面的逻辑来判断哪一个。请注意,我不是 macos 专家 - 我相信 Linux 工具对于 macos 也同样适用
/bin 和 /usr/bin 中的大多数文件是 stripped binaries(少数是创建“别名”的符号链接,或实现现有命令的小脚本,通常使用其他二进制文件)。
二进制文件是stripped 的事实意味着调试器(gdb 或其他工具,如 ltrace 等)可以查看函数名、变量名等(执行man strip 以查看删除的内容)。可以不“剥离”的项目之一是共享库列表。
鉴于此信息,可能从共享库列表中获得一些线索。 C++ 程序通常会链接到“标准 C++”共享库(libstdc++.so.N,其中 N 是版本,目前为 6)。大多数其他语言都有自己的将被链接的运行时共享库。大多数“C”程序将与标准 C 运行时 (/lib.c.so.N) 链接。
底线:考虑以下过程:
-
file -L /bin/sh(或任何其他二进制文件):
- 如果输出中包含“脚本”,则程序执行为 s 脚本
- 如果输出指示二进制(
ELF shared object 或类似):
- 运行 'ldd /bin/sh`
- 如果输出包含“libstdc++.so” - 代码包含一些 c++ - 最像 C++ 源代码
- 如果输出包含“libc.so.” - 程序包含一些 c - 最像 C 程序
owner@vm1:~/Projects/SO/ff1$ file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=452da38d6212b692cd80eb0dd1c99cf853da31ae, stripped
owner@vm1:~/Projects/SO/ff1$ ldd /bin/bash
linux-vdso.so.1 (0x00007ffcb87fe000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f5e7cd8e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5e7cb8a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5e7c799000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5e7d2d2000)
wner@vm1:~/Projects/SO/ff1$ file /usr/bin/zlib-flate
/usr/bin/zlib-flate: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=bbc1bc3fbbb71c7ae3cf9ef9f2876098df3fd752, stripped
owner@vm1:~/Projects/SO/ff1$ ldd !$
ldd /usr/bin/zlib-flate
linux-vdso.so.1 (0x00007fffeb3be000)
libqpdf.so.21 => /usr/lib/x86_64-linux-gnu/libqpdf.so.21 (0x00007f2f8ee45000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f2f8eabc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2f8e8a4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2f8e4b3000)
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007f2f8e24b000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2f8e02e000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2f8dc90000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2f8f313000)
注意:
* 从技术上讲,可以使用静态链接“欺骗”这种逻辑,但大多数(所有)二进制文件都将使用动态链接。