查看共享对象模块(lib*.so)内容的命令行

38

如何查看共享对象模块(lib *.so)的内容?

和使用以下命令行相似:

ar -t lib*.a

该命令用于归档文件(lib*.a),并展示库中的所有目标文件。

编辑1

示例

ar -t lib*.a

给我显示:

asset.o

sldep.o

注:该文本为原文,无需翻译。
3个回答

66
使用命令nm -D --defined-only libname.so可以获取动态库中的符号名称。
--defined-only选项只显示在这些文件中定义的符号,而不是对外部函数的引用。
另一种方法是使用objdump,并仅捕获文本部分中的符号:
objdump -T /usr/lib/libjpeg.so | grep text
...
0001b5c0 g    DF .text  00000016  Base        jdiv_round_up
00003730 g    DF .text  00000417  Base        jpeg_set_colorspace
0000cda0 g    DF .text  000002de  Base        jpeg_consume_input
00002b30 g    DF .text  00000023  Base        jpeg_abort_compress
00003b50 g    DF .text  000000b6  Base        jpeg_default_colorspace
00002810 g    DF .text  00000067  Base        jpeg_suppress_tables
00004110 g    DF .text  00000130  Base        jpeg_add_quant_table
000100c0 g    DF .text  0000011f  Base        jpeg_save_markers
...

@Jack Kelly:objdump工具似乎更全面,但是与OP有什么区别? - Matt Joiner
1
@Matt Joiner:这个答案和我的区别在于提到了 nm -D --defined-onlynm -D 会显示未定义的符号等内容,如果你只想查看库本身定义了什么,则这些都是噪音。 - Jack Kelly
你如何查看每个函数的内容? - John Sardinha

19
我认为你要找的是nm -D命令。
$ nm -D /usr/lib/libpng.so
...
00000000000058f0 T png_reset_zstream
000000000000d420 T png_save_int_32
000000000000d450 T png_save_uint_16
000000000000d3f0 T png_save_uint_32
0000000000007810 T png_set_IHDR
0000000000007500 T png_set_PLTE
000000000000ce20 T png_set_add_alpha
0000000000006670 T png_set_asm_flags
0000000000006970 T png_set_bKGD
000000000001a740 T png_set_background
...

我创建了一个动态库(lib*.so文件)并在其中添加了一些函数,所以我需要一个命令行来显示其内容(即函数)。 - Pavitar
你如何查看每个函数的内容? - John Sardinha

6
nm -D 命令可以列出您的共享库的动态符号,这似乎正是您想要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接