- 使用objdump命令
objdump是一个显示二进制文件信息的命令。可以用-t参数,显示.a文件的符号信息。例如:
root@root:/home/live/UsageEnvironment$ objdump -t libUsageEnvironment.a
在归档文件 libUsageEnvironment.a 中:
UsageEnvironment.o: 文件格式 elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 UsageEnvironment.cpp
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l d .rodata._ZTS16UsageEnvironment 0000000000000000 .rodata._ZTS16UsageEnvironment
0000000000000000 l d .data.rel.ro._ZTI16UsageEnvironment 0000000000000000 .data.rel.ro._ZTI16UsageEnvironment
0000000000000000 l d .rodata._ZTS13TaskScheduler 0000000000000000 .rodata._ZTS13TaskScheduler
0000000000000000 l d .data.rel.ro._ZTI13TaskScheduler 0000000000000000 .data.rel.ro._ZTI13TaskScheduler
0000000000000000 l d .data.rel.ro._ZTV16UsageEnvironment 0000000000000000 .data.rel.ro._ZTV16UsageEnvironment
0000000000000000 l d .data.rel.ro._ZTV13TaskScheduler 0000000000000000 .data.rel.ro._ZTV13TaskScheduler
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 l d .rodata.str1.1 0000000000000000 .rodata.str1.1
0000000000000000 l d .data.rel.ro.local 0000000000000000 .data.rel.ro.local
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .eh_frame 0000000000000000 .eh_frame
0000000000000000 l d .comment 0000000000000000 .comment
0000000000000000 l d .group 0000000000000000 .group
0000000000000000 l d .group 0000000000000000 .group
0000000000000000 l d .group 0000000000000000 .group
0000000000000000 l d .group 0000000000000000 .group
0000000000000000 l d .group 0000000000000000 .group
0000000000000000 l d .group 0000000000000000 .group
0000000000000000 g F .text 000000000000003c _ZN13TaskScheduler21rescheduleDelayedTaskERPvlPFvS0_ES0_
0000000000000040 g F .text 0000000000000009 _ZN16UsageEnvironment13internalErrorEv
0000000000000000 *UND* 0000000000000000 _GLOBAL_OFFSET_TABLE_
0000000000000000 *UND* 0000000000000000 abort
0000000000000040 g F .text 0000000000000009 _ZN13TaskScheduler13internalErrorEv
0000000000000050 g F .text 000000000000002b _ZN16UsageEnvironment7reclaimEv
0000000000000080 g F .text 000000000000001f _ZN16UsageEnvironmentC2ER13TaskScheduler
0000000000000000 w O .data.rel.ro._ZTV16UsageEnvironment 0000000000000090 _ZTV16UsageEnvironment
0000000000000080 g F .text 000000000000001f _ZN16UsageEnvironmentC1ER13TaskScheduler
00000000000000a0 g F .text 0000000000000002 _ZN16UsageEnvironmentD2Ev
00000000000000a0 g F .text 0000000000000002 _ZN16UsageEnvironmentD1Ev
00000000000000b0 g F .text 000000000000000a _ZN16UsageEnvironmentD0Ev
0000000000000000 *UND* 0000000000000000 _ZdlPvm
00000000000000c0 g F .text 000000000000000b _ZN13TaskSchedulerC2Ev
0000000000000000 w O .data.rel.ro._ZTV13TaskScheduler 0000000000000070 _ZTV13TaskScheduler
00000000000000c0 g F .text 000000000000000b _ZN13TaskSchedulerC1Ev
00000000000000d0 g F .text 0000000000000002 _ZN13TaskSchedulerD2Ev
00000000000000d0 g F .text 0000000000000002 _ZN13TaskSchedulerD1Ev
00000000000000e0 g F .text 000000000000000a _ZN13TaskSchedulerD0Ev
0000000000000000 w O .rodata._ZTS16UsageEnvironment 0000000000000013 _ZTS16UsageEnvironment
0000000000000000 w O .data.rel.ro._ZTI16UsageEnvironment 0000000000000010 _ZTI16UsageEnvironment
0000000000000000 *UND* 0000000000000000 _ZTVN10__cxxabiv117__class_type_infoE
0000000000000000 w O .rodata._ZTS13TaskScheduler 0000000000000010 _ZTS13TaskScheduler
0000000000000000 w O .data.rel.ro._ZTI13TaskScheduler 0000000000000010 _ZTI13TaskScheduler
0000000000000000 *UND* 0000000000000000 __cxa_pure_virtual
0000000000000000 g O .rodata 0000000000000004 UsageEnvironmentLibraryVersionInt
0000000000000000 g O .data.rel.ro.local 0000000000000008 UsageEnvironmentLibraryVersionStr
- 使用nm命令
nm 命令可以列出目标文件中的符号。例如:
root@root:/home/live/UsageEnvironment$ nm libUsageEnvironment.a
UsageEnvironment.o:
U abort
U __cxa_pure_virtual
U _GLOBAL_OFFSET_TABLE_
0000000000000000 R UsageEnvironmentLibraryVersionInt
0000000000000000 D UsageEnvironmentLibraryVersionStr
U _ZdlPvm
0000000000000040 T _ZN13TaskScheduler13internalErrorEv
0000000000000000 T _ZN13TaskScheduler21rescheduleDelayedTaskERPvlPFvS0_ES0_
00000000000000c0 T _ZN13TaskSchedulerC1Ev
00000000000000c0 T _ZN13TaskSchedulerC2Ev
00000000000000e0 T _ZN13TaskSchedulerD0Ev
00000000000000d0 T _ZN13TaskSchedulerD1Ev
00000000000000d0 T _ZN13TaskSchedulerD2Ev
0000000000000040 T _ZN16UsageEnvironment13internalErrorEv
0000000000000050 T _ZN16UsageEnvironment7reclaimEv
0000000000000080 T _ZN16UsageEnvironmentC1ER13TaskScheduler
0000000000000080 T _ZN16UsageEnvironmentC2ER13TaskScheduler
00000000000000b0 T _ZN16UsageEnvironmentD0Ev
00000000000000a0 T _ZN16UsageEnvironmentD1Ev
00000000000000a0 T _ZN16UsageEnvironmentD2Ev
0000000000000000 V _ZTI13TaskScheduler
0000000000000000 V _ZTI16UsageEnvironment
0000000000000000 V _ZTS13TaskScheduler
0000000000000000 V _ZTS16UsageEnvironment
0000000000000000 V _ZTV13TaskScheduler
0000000000000000 V _ZTV16UsageEnvironment
U _ZTVN10__cxxabiv117__class_type_infoE
- 使用nm命令加-C参数或者|c++filt
由于C++代码在编译时使用name mangling的规则对各种符号进行了重命名,objdump或nm输出的符号列表与代码里写的函数名称不好对应上。c++filt 是一个用于解析C++ name mangling的工具。将nm的输出传递给c++filt可以提高可读性。nm后面加-C参数,输出的效果也一样。例如:
root@root:/home/live/UsageEnvironment$ nm libUsageEnvironment.a |c++filt
UsageEnvironment.o:
U abort
U __cxa_pure_virtual
U _GLOBAL_OFFSET_TABLE_
0000000000000000 R UsageEnvironmentLibraryVersionInt
0000000000000000 D UsageEnvironmentLibraryVersionStr
U operator delete(void*, unsigned long)
0000000000000040 T TaskScheduler::internalError()
0000000000000000 T TaskScheduler::rescheduleDelayedTask(void*&, long, void (*)(void*), void*)
00000000000000c0 T TaskScheduler::TaskScheduler()
00000000000000c0 T TaskScheduler::TaskScheduler()
00000000000000e0 T TaskScheduler::~TaskScheduler()
00000000000000d0 T TaskScheduler::~TaskScheduler()
00000000000000d0 T TaskScheduler::~TaskScheduler()
0000000000000040 T UsageEnvironment::internalError()
0000000000000050 T UsageEnvironment::reclaim()
0000000000000080 T UsageEnvironment::UsageEnvironment(TaskScheduler&)
0000000000000080 T UsageEnvironment::UsageEnvironment(TaskScheduler&)
00000000000000b0 T UsageEnvironment::~UsageEnvironment()
00000000000000a0 T UsageEnvironment::~UsageEnvironment()
00000000000000a0 T UsageEnvironment::~UsageEnvironment()
0000000000000000 V typeinfo for TaskScheduler
0000000000000000 V typeinfo for UsageEnvironment
0000000000000000 V typeinfo name for TaskScheduler
0000000000000000 V typeinfo name for UsageEnvironment
0000000000000000 V vtable for TaskScheduler
0000000000000000 V vtable for UsageEnvironment
U vtable for __cxxabiv1::__class_type_info
上述输出,
U表示未定义的符号(Undefined symbol),即本文件仅声明不定义,它在其他文件里定义。__cxa_pure_virtual 是 C++ 中当调用一个纯虚函数时调用的函数;
T - Text/Code(代码):表示这个符号是一个代码段中的符号,通常用于函数。
V表示虚表(vtable)或类型信息(typeinfo)的条目;
R - Read-Only Data(只读数据):表示这个符号是一个只读数据段中的符号,通常用于常量。
D - Data(数据):表示这个符号是一个可读写的数据段中的符号,通常用于全局变量。