[英]Linker. How could symbol be defined and undefined simultaneously?
$ nm --demangle /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/libsupc++.a | grep "__cxxabiv1::__class_type_info::~__class_type_info"
給出以下輸出:
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
0000000000000000 T __cxxabiv1::__class_type_info::~__class_type_info()
U __cxxabiv1::__class_type_info::~__class_type_info()
U __cxxabiv1::__class_type_info::~__class_type_info()
那么,如何解釋此輸出?
T
)-可能如何? 為什么鏈接程序會產生違反ODR
此類庫? 什么目的? 為什么所有的人都有相同的(和奇怪的)地址( 0000000000000000
)? T
)和未定義的符號( U
)? 靜態庫(存檔文件.a
)實質上是單個.o
文件的集合(加上一些索引信息,以便鏈接程序可以找到所需的.o
文件)。 這些未定義符號中的某些與定義它們的符號位於不同的對象中。 如果查看nm
的完整輸出,這將變得很清楚。 (或對nm
使用-o
標志。)
您具有多個已定義符號的原因是, demangle
不是demangle
操作。 在我的libsupc++
副本中,這三個定義是:
0000000000000000 T _ZN10__cxxabiv117__class_type_infoD0Ev
0000000000000000 T _ZN10__cxxabiv117__class_type_infoD1Ev
0000000000000000 T _ZN10__cxxabiv117__class_type_infoD2Ev
為什么有幾個符號都與析構函數互斥? 它們是不同情況的破壞者 。 gcc使用Itanium ABI for C ++,其名稱處理規則在此處描述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.