libstdc ++有什么功能。所以提供?

时间:2013-05-31 13:17:36

标签: c++

几乎所有真正的可执行c ++程序都链接到libstdc ++。所以。这个共享库提供什么样的功能?

我认为很多工作都是在编译时完成的,例如模板实例化,在编译之前无法完成。

2 个答案:

答案 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

如果将是巨大的,详尽的......但它会告诉你出口的东西。