一、file 指令示例
在 Linux 系统中,可以使用 file 命令 来查看一个可执行文件是静态链接的还是动态链接的。
使用方式
file executable_file
创建 hello_test.c 文件,测试代码如下:
#include <stdio.h>
int main(void)
{
printf("Hello, static world!\n");
return 0;
}
使用 gcc 编译并静态链接 参数 -static ,指令如下:
生成一个静态链接的可执行文件
gcc -o static_hello hello_test.c -static
生成一个动态链接的可执行文件,指令如下:
使用 gcc 编译(默认是动态链接):
gcc -o dynamic_hello hello_test.c
使用 file 命令检查这两个可执行文件
静态可执行文件:
file static_hello
static_hello: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=bf3f1bd5a15d6f50850824876f45159efd39b596, not stripped
动态可执行文件:
file dynamic_hello
dynamic_hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=8fd973c9992d07615466b6e8fb785393ea8eb7c1, not stripped
二、ldd 命令
ldd 命令(list dynamic dependencies)用于打印共享库依赖关系。如果一个文件是动态链接的,ldd 将列出它依赖的所有共享库。如果文件是静态链接的,ldd 将无法找到任何依赖项,并可能返回一个错误消息,如“not a dynamic executable”或“not ELF executable”。
使用方式
ldd executable_file
1.如果输出列出了共享库,那么文件是动态链接的。
2.如果输出显示“not a dynamic executable”或类似的消息,那么文件很可能是静态链接的。
静态可执行文件:
ldd static_hello
动态可执行文件:
ldd dynamic_hello
linux-vdso.so.1 (0x00007fff682f7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd5f62e1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd5f68d4000)
三、readelf 命令
readelf 命令用于显示 ELF 格式文件的信息。可以使用它来检查文件的头部信息,特别是 interpreter 字段,该字段仅存在于动态链接的文件中。
使用方式
readelf -l executable_file | grep 'interp'
1.如果找到了 Interpreter 字段,并且它指向了一个动态链接器(如 /lib64/ld-linux-x86-64.so.2),那么文件是动态链接的。
2.如果没有找到 interpreter 字段,那么文件很可能是静态链接的。
静态可执行文件:
readelf -a static_hello
readelf -l static_hello
readelf -l static_hello | grep 'interp'
readelf -l static_hello | grep interp
动态可执行文件:
readelf -a dynamic_hello
readelf -l dynamic_hello
readelf -l dynamic_hello | grep 'interp'
readelf -l dynamic_hello | grep interp
四、objdump 命令
objdump 命令是另一个用于显示二进制文件信息的工具。可以使用它来检查文件的头部,特别是动态链接标志。
使用方式
objdump -p executable_file | grep 'DYNAMIC'
静态可执行文件:
objdump -p static_hello | grep 'DYNAMIC'
objdump -T static_hello
动态可执行文件:
objdump -p dynamic_hello | grep 'DYNAMIC'
objdump -T dynamic_hello
通常 file 命令足以确定一个文件是静态链接还是动态链接的,但其他工具如 ldd、readelf 和 objdump 提供了文件更详细的信息,可以更深入地了解文件的结构和依赖关系。