链接中的符号non-virtualthunk到底是什么
(2022-03-18 19:16:14)
标签:
non-virtualthunkundefinedsymbol |
分类: 计算机与 Internet |
最近实现Apple Silicon,在链接时报错未解析符号
non-virtual thunk to QLayout::layout()
不知道如何生成这个符号。
经过一段时间的研究,发现这个只需要有多个基类,并且layout在第二个基类的虚方法列表中
并且,只有当第一个基类中也有虚函数表时,才会产生
non-virtual thunk to QLayout::layout()
直实做出来,才会发现,这东西就是上次查看的hnxx
conanchen@ConanChen ~ % nm -nm
/Users/conanchen/M1Tools/Debug/Debug/libfaked_qtnonvirtual.a | grep
layout
00000000000001b8 (__TEXT,__text) external
__ZN12QLayoutBaseB6layoutEv
0000000000000240 (__TEXT,__text) external
__ZN7QLayout6layoutEv
0000000000000250 (__TEXT,__text) external
__ZThn8_N7QLayout6layoutEv
conanchen@ConanChen ~ % nm -nm
/Users/conanchen/client-delivery/Output/MAC64/Core/Neutron/UI/Base/Fusion360.build/Release/NuBase.build/Objects-normal/arm64/ThreeBarLayout.o
| grep layout
(undefined) external __ZN7QLayout6layoutEv
(undefined) external __ZThn16_N7QLayout6layoutEv
其中__ZThn8_N7QLayout6layoutEv和__ZThn16_N7QLayout6layoutEv
只有数字不同,这个是代表基类里面的成员变量等产生的偏移,这个需要手动了。
在第一个基类加上void* behn16;
就能把hn8变为hn16