ar::start::initial:start(int a,int b),经过编译成.o后,变成了什么名称?
c++编译后的函数名
c++源代码,编译时,函数名会被编译器修改,变成编译器内部的名字(名字规则由编译器定义)。
修改后的名字,会在链接时用到。
linux g++,翻译规则:
每个方法都是以_Z开头,对于嵌套的名字(比如名字空间中的名字或者是类中间的名字,比如Class::Func)后面紧跟N , 然后是各个名字空间和类的名字,每个名字前是名字字符的长度,再以E结尾。(如果不是嵌套名字则不需要以E结尾)
c++filt 工具,将编译后的函数名,翻译成源码函数名
实例:
源码:
TunApplication_base.cc:(.text+0x40c): undefined reference to `vkn::com::Runtime::getInstance()
include/vkn/com/runtime.h
/*!
* \brief Returns an instance of Runtime class
* \return Runtime instance
*/
static Runtime& getInstance();
二进制库:
objdump -D libvkn.a
0000000000002464 <_GLOBAL__sub_I__ZN3vkn3com7Runtime11getInstanceEv>:
2464: a9bf7bfd stp x29, x30, [sp, #-16]!
2468: 910003fd mov x29, sp
246c: 529fffe1 mov w1, #0xffff // #65535
2470: 52800020 mov w0, #0x1 // #1
2474: 97ffff2a bl 211c <_Z41__static_initialization_and_destruction_0ii>
2478: a8c17bfd ldp x29, x30, [sp], #16
247c: d65f03c0 ret