簡體   English   中英

在 32 位環境中調用 ___tls_get_addr 是否危險?

[英]Is it dangerous, that ___tls_get_addr called in 32bit environment?

我們有 x86_64 系統,但所有庫和應用程序都是為 i386 構建的,我們在 i386 模式下運行它們。 gdb(以及 ltrace)告訴我們,使用了 ___tls_get_addr,它是為 x86_64 設計的,據我所知___tls_get_addr gnu ),我們還有 glibc 版本 2.19-18(看起來問題僅在 glibc-2.24 中修復)。 從以 i386 模式運行的應用程序調用 ___tls_get_addr 是否危險? 如果它是一個問題,我們如何解決這個問題? 提前致謝。

您引用的__tls_get_addr堆棧對齊中GCC 錯誤特定於 x86-64。 它在 i386 上不存在。 我假設您在問題中交換了 i386 和 x86-64。

一般來說,分發工具鏈是一致的並且經過良好測試。 如果您使用系統編譯器編譯您的程序並使用系統 glibc 版本,則__tls_get_addr將按預期工作,即使 GCC 錯誤尚未修復。 只有當有錯誤的程序使用恰好使用向量指令的malloc運行時,該錯誤才會出現。 使用 glibc 的malloc ,這只發生在 GCC 7 或更高版本。 一旦 Fedora 開始使用 GCC 7 作為系統編譯器,就發現了 glibc 中 GCC 錯誤的不完整解決方法,並在上游實施了更完整的解決方法(並集成到 Fedora 中)。 在 GCC 7 切換之前,有問題的應用程序運行良好。

一些發行版已向后移植此修復程序,因為它們支持多個編譯器和malloc實現。 最后,這是一個發行版集成問題,因此如果您有疑問,您需要與您的發行版支持人員交談。

___tls_get_addr (三個下划線)只是一個內部實現細節。 它對 glibc 2.20 及更早版本中的某些調試工具可見,因為它不是隱藏符號。 在 glibc 2.21 及更高版本中,它被隱藏(在 i386 上),並且ltrace和類似工具將不再報告它。 這只是一個小的性能優化,它不影響功能。

暫無
暫無

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

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