Linux下查看二进制文件信息

1. 简介

在Linux系统中,我们经常会遇到需要查看二进制文件的情况,比如查看程序的版本信息、运行依赖库等。本文将介绍如何在Linux下查看二进制文件的信息。

2. 使用file命令

file命令是Linux系统中一个非常实用的命令,它可以用来查看文件的类型信息。对于二进制文件,file命令可以告诉我们文件的具体类型。

$ file /path/to/binary-file

使用上述命令,将/path/to/binary-file替换为二进制文件的实际路径,即可显示文件的类型信息。

2.1 file命令的输出解读

file命令的输出结果通常包含两部分信息:文件路径和文件类型。

/path/to/binary-file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped

上述示例中,/path/to/binary-file是二进制文件的路径,而ELF 64-bit LSB executable则是文件的具体类型信息。

2.2 file命令的其他参数

file命令还支持一些其他参数,可以进一步丰富输出信息。比如:

-b参数:以简洁形式输出文件类型。

-e参数:显示每个字节的详细信息。

-i参数:输出MIME类型。

-F参数:输出文件类型的描述信息。

根据需要,可以结合这些参数使用file命令,获得更加详细和准确的文件信息。

3. 使用readelf命令

readelf命令是Linux系统中的一个强大工具,它用于查看和解析ELF文件格式的信息。对于可执行的二进制文件,readelf命令可以显示程序头表、段表、符号表等详细信息。

$ readelf -a /path/to/binary-file

使用上述命令,将/path/to/binary-file替换为二进制文件的实际路径,即可显示文件的详细信息。

3.1 readelf命令的输出解读

readelf命令的输出结果通常包含了很多信息,这里介绍几个常用的:

程序头表

程序头表(Program Header Table)记录了可执行文件在内存中的各个段的起始地址和大小等信息。

Elf file type is EXEC (Executable file)

Entry point 0x400690

There are 8 program headers, starting at offset 64

段表

段表(Section Header Table)记录了可执行文件的各个段的起始地址、大小、属性等信息。

Section Headers:

[Nr] Name Type Address Offset

...

[13] .dynstr STRTAB 0000000000400b08 00000b08

...

[21] .init_array INIT_ARRAY 0000000000600e08 00000e08

...

[28] .data.rel.ro PROGBITS 0000000000601040 00001040

...

[42] .text PROGBITS 0000000000400690 00000690

...

There are 47 section headers, starting at offset 6408

符号表

符号表(Symbol Table)记录了可执行文件中定义的符号的相关信息,包括符号名称、地址、大小等。

Symbol table '.symtab' contains 491 entries:

Num: Value Size Type Bind Vis Ndx Name

...

482: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND __libc_start_main@@GLIBC_2.2.5

...

488: 0000000000000000 0 NOTYPE WEAK DEFAULT 12 data_start

...

491: 0000000000000000 0 NOTYPE GLOBAL DEFAULT ABS _end

...

通过readelf命令,我们可以查看到二进制文件的各种详细信息,帮助我们更好地了解、调试和分析程序。

4. 使用objdump命令

objdump命令是Linux系统中的另一个用于查看二进制文件信息的工具,它可以显示可执行文件的汇编代码、符号表、重定位表等。

$ objdump -h /path/to/binary-file

使用上述命令,将/path/to/binary-file替换为二进制文件的实际路径,即可显示文件的详细信息。

4.1 objdump命令的输出解读

objdump命令的输出结果通常包含了很多信息,这里介绍几个常用的:

节(Section)

节是可执行文件的一部分,它包含了程序的代码、数据和其他一些信息。

Sections:

Idx Name Size VMA LMA File off Algn

...

11 .data 00000198 00000000006b4030 00000000006b4030 00003030 2**6

...

15 .dynstr 00000162 00000000006b41c0 00000000006b41c0 000031c0 2**0

...

18 .text 00001658 0000000000400690 0000000000400690 00000690 2**4

...

符号表

符号表(Symbol Table)记录了可执行文件中定义的符号的相关信息,包括符号名称、地址、大小等。

SYMBOL TABLE:

...

00000000006b4000 l d .data 0000000000000000 .data

00000000006b3f68 l d .bss 0000000000000000 .bss

0000000000000025 g F .text 000000000000000b __libc_csu_fini

0000000000400510 g F .text 000000000000015a main

00000000004003a0 g F .text 00000000000000ec __libc_csu_init

...

重定位表

重定位表(Relocation Table)记录了在链接过程中需要进行重定位的信息。

Relocation section '.rela.dyn' at offset 0x6b2c0 contains 15 entries:

Offset Info Type Symbol's Value Symbol's Name + Addend

...

00000000006b4160 0000000600000007 R_X86_64_RELATIVE 6020

...

00000000006b4170 000000060000000a R_X86_64_REX_GOTPCRELX puts@GLIBC_2.2.5 + 0x7

...

通过objdump命令,我们可以查看到二进制文件的各种详细信息,帮助我们更好地了解、调试和分析程序。

5. 总结

本文介绍了在Linux下查看二进制文件信息的方法。通过file命令,我们可以快速了解文件的类型。而readelf和objdump命令则可以提供更加详细和全面的文件信息,包括程序头表、段表、符号表等。

这些工具在Linux系统中非常常用,对于软件开发和系统调试都有着重要的作用。熟练使用它们,可以更加高效地进行工作。

操作系统标签