1. 程式人生 > 其它 >低版本環境執行高版本生成的ASan程式(轉)

低版本環境執行高版本生成的ASan程式(轉)

Address Sanitizer(ASan)是一個快速的記憶體錯誤檢測工具。它非常快,只拖慢程式兩倍左右(比起Valgrind快多了)。它包括一個編譯器instrumentation模組和一個提供malloc()/free()替代項的執行時庫。

從gcc 4.8開始,AddressSanitizer成為gcc的一部分。當然,要獲得更好的體驗,最好使用4.9及以上版本,因為gcc 4.8的AddressSanitizer還不完善,最大的缺點是沒有符號資訊。

但是,由於經常限於現有測試環境或生產環境的原因,目標程式的ASan版本往往會使用gcc高版本進行編譯生成,但是既有環境又是受限於作業系統的低版本,因此需要將高版本的目標程式移植到低版本環境執行時,往往會啟動失敗,因為缺少相應的庫或系統版本太低。這時需要做一些額外的配置。

  1. 將libasan.so.3庫拷貝到目標程式的執行依賴庫路徑,或直接放置到目標程式同路徑下;
  2. 如果遇到libstdc++.so庫版本的問題(符號識別問題),也需要更新目標環境的libstdc++.so庫檔案。root下執行ll /lib64/libstdc++.so.6,檢視軟連線指向的版本,如果是6.0.22,則忽略以下操作;並記下該版本檔名稱;cp libstdc++.so.6.0.22到/lib64/目錄下,重新定位軟連線:ln –snf /lib64/libstdc++.so.6.0.22 /lib64/libstdc++.so.6

然後啟動目標程式,即可執行成功,這樣既不需要再低版本gcc下重新安裝asan進行編譯,也不需要把目標環境進行逐一升級。

https://www.modb.pro/db/76403

有時候,不小心知道了一些事,才發現自己所在乎的事是那麼可笑。