簡體   English   中英

連結器。 如何同時定義和取消定義符號?

[英]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()

那么,如何解釋此輸出?

  1. 這是符號的多個定義(三個T )-可能如何? 為什么鏈接程序會產生違反ODR此類庫? 什么目的? 為什么所有的人都有相同的(和奇怪的)地址( 0000000000000000 )?
  2. 如何同時定義同一符號( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM