几乎所有真正的可执行c ++程序都链接到libstdc ++。所以。这个共享库提供什么样的功能?
我认为很多工作都是在编译时完成的,例如模板实例化,在编译之前无法完成。
答案 0 :(得分:7)
libstdc ++为用户空间C ++应用程序提供运行时支持。该库中的内容是特定于实现的,可能会从一个版本更改为下一个版本。你不应该依赖那里的东西。
除了理论之外,共享库总是导出诸如函数和/或数据之类的符号。您可以使用许多工具来查看这些符号。其中之一是nm
;如果指定-D
参数,它将显示动态符号。所以让我们在libstdc ++上做。所以。 (列表非常大,所以我使用head -20
来限制它。)
$ nm -D /lib64/libstdc++.so.6 | head -20
U abort
U __assert_fail
000000386565d2b0 T atomic_flag_clear_explicit
000000386565d2f0 T __atomic_flag_for_address
000000386565d2a0 T atomic_flag_test_and_set_explicit
000000386565d2c0 T __atomic_flag_wait_explicit
U bindtextdomain
U btowc
U __ctype_get_mb_cur_max
000000386565dd10 T __cxa_allocate_dependent_exception
000000386565dae0 T __cxa_allocate_exception
U __cxa_atexit
000000386565df10 T __cxa_bad_cast
000000386565df50 T __cxa_bad_typeid
000000386565dfe0 T __cxa_begin_catch
000000386565eb10 T __cxa_call_unexpected
000000386565f160 T __cxa_current_exception_type
000000386565fa00 T __cxa_deleted_virtual
0000003865668990 T __cxa_demangle
000000386565e050 T __cxa_end_catch
这些只是C ++运行时提供的一些功能。在上述情况中,大多数是实施Exception Handling according to Itanium C++ ABI的人
另请注意,C ++名称可能会受到损坏,例如,您可能遇到类似 _ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale 的内容。要弄清楚它意味着什么,自己解构它可能会非常困难。因此,还有一个名为c++filt
的工具可以帮助解决此问题,例如将其称为c++filt _ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale
。
您甚至可以使用它来解除任何看似被破坏的符号,例如nm -D /lib64/libstdc++.so.6 | c++filt
。
当然,这适用于任何共享对象,而不仅仅是C ++运行时。
答案 1 :(得分:3)
如果您真的想拥有库中明确定义的函数列表,可以在库文件中使用nm
命令:
nm -D -C -g --defined-only /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so | less
如果将是巨大的,详尽的......但它会告诉你出口的东西。