在linux下查看C++写的.a库文件有哪些函数的方法

  • 使用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(数据):表示这个符号是一个可读写的数据段中的符号,通常用于全局变量。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值