簡體   English   中英

是否可以通過使用隱藏可見性來避免 ODR 違規?

[英]Can ODR violation be avoided by using hidden visibility?

因此,例如,我的一個項目中有一個稍微復雜的庫依賴案例:


              /--------------------------------\
              |                                |
      /----> GRPC <------------------\         |
      |                              |         |
      |        (c++)                 |         |        
      \-------   A  -------------->  B         |
                 |                 (rust)      |
                 |                             |
                 \------------------> c++  <---/ 

Rust 默認會優先使用 static 鏈接。 可執行文件 A 也被構建為靜態鏈接 lib(std)c++。 因此,據我了解,A 和 B 中都會有兩個 STL 實現副本。這正是https://developer.ZC31B32364CE19CA8FCD150A417ECCE58-support.com建議的模式

但是,查看 B 的動態鏈接表(例如通過nm -D ); 我看不到導出的 lib(std)c++/grpc 符號。 這是因為 rust 默認將它們標記為隱藏。

  • 那么,如果 B 中的所有常見符號都被隱藏,它是否安全(或符合 ODR)?

符合 ODR

一定義規則是C++編程語言的一部分。 它與 C++ 語言有關。 這與其他任何事情都無關。 C++ 的“外部”沒有 ODR。 C++ 標准不適用於 C++ 之外,它僅適用於 C++ 編程語言。

關於語言互操作性,沒有廣泛采用的可移植超級標准。 這些只是工具,沒有定義和規則。 ODR 或 C++ 中的任何其他規則在此處不適用。

嘗試將 C++ 標准規則應用於不相關的上下文幾乎沒有意義。 Rust 不是 C++ 的一部分。 RPC 是特定於平台的,在 C++ 編程語言的 scope 之外。

因此,推理某些 C++ 規則將或不會在使用平台特定工具的工作鏈中被破壞 - 共享庫,“動態鏈接表” - 並使用多種編程語言在這里並不適用。

在 C++ 的意義上,這一切都是“未定義的行為”——C++ 標准中沒有任何規則可以適用於此。

是否可以通過使用隱藏可見性來避免 ODR 違規?

當然。

android 文檔說:

在這種情況下,STL,包括全局數據和 static 構造函數,將出現在兩個庫中。 這個應用程序的運行時行為是未定義的,在實踐中崩潰是很常見的。 其他可能的問題包括:

Memory 在一個庫中分配,在另一個庫中釋放,導致 memory 泄漏或堆損壞。

你提到那些符號是隱藏的。 但是,是否等於,全局數據呈現兩次?

如果全局數據可以呈現兩次,則可能會出現“內存分配在一個庫中,而在另一個庫中釋放,導致 memory 泄漏或堆損壞”的情況。 For example, if some memory is allocated in Rust, and we transfer it to C++, and C++ later frees it, then we are facing this situation. 當然你的代碼可能沒有這種情況,但是如果將來有代碼違反了,或者如果有一天你使用了違反它的第三方庫,那么我們就有麻煩了(並且似乎很難調試)。

確實,讓 C++靜態鏈接 Rust 代碼怎么樣? 然后你會得到一個巨大的.so文件,其中包含你的 C++、你的 Rust、你的依賴項等。但是,即使你可以做到這一點,我們可能仍然需要小心:巨型.so文件是你整個 ZE84ZDB6DB60B9390CDBDD46C 中唯一的一個嗎?應用程序? 換句話說,你確定你沒有,也永遠不會有任何其他原生庫嗎? 如果沒有,恕我直言,我們可能仍然會再次面臨問題。

無論如何,我不是 Android/C++ 方面的專家。 幾個月前我遇到了類似的問題(將“C++ 代碼”替換為“用 C++ 編寫的 Flutter 引擎”等等)並做了一些解決方法。 所以這篇文章並不是真正的答案,而是一些(可能是錯誤的)想法和建議。 希望有人能糾正我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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