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

yua*_*uan 3 c++

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

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

小智 8

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
Run Code Online (Sandbox Code Playgroud)

这些只是C++运行时提供的一些功能.在上面的例子中,大多数是根据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++运行时.


Mat*_*get 5

如果你真的想要在库中明确定义的函数列表,你可以nm在库文件上使用命令:

nm -D -C -g --defined-only /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so | less

如果将是巨大的,详尽的......但它会向您展示导出的内容。