1. 程式人生 > >Linux匯出符號衝突相關問題總結

Linux匯出符號衝突相關問題總結

在linux中使用動態連結庫進行連結時出現衝突導致crash,檢視原因是因為我們的動態連線庫中使用的protubuf版本與對方使用的版本衝突。但是我們產品中的protubuf是以靜態庫的方式鏈入,怎麼會出現版本衝突呢。谷歌了一下,究其原因是因為在Linux中會預設將所有匯入的第三方庫的介面一併匯出,這使得產品先啟動後再load我們的引擎的時候,我們的第三方庫在使用介面的時候,使用的並不是我們自己版本的介面,而是產品使用的版本的介面。

如果想檢視動態連結庫匯出符號表可以使用objdump工具,linux下 objdump -T xxxx.so > symbol.log  便可以檢視所有動態連結庫匯出的介面。

在Linux中就需要去手動控制動態連結庫或者靜態連結庫匯出的介面。

在使用cmake編譯的專案中,可以增加xxx.map與xxx.sym檔案在CMakeList.txt中對匯出函式進行控制。.map用於控制動態連結庫匯出符號,.sym檔案檔案用於控制靜態連結庫匯出符號,同時在編譯引數上也有區別,--retain-symbols-file控制靜態符號表--version-script 控制動態符號表。所以舉個例子:

假設libxxx.so為我們的動態連結庫,export.map為控制動態連結庫匯出符號的檔案,其中global區域代表我們想要匯出的符號,local區域代表不想匯出的符號,*號表示除了global中的符號全部不匯出。

export.map檔案內容如下:

libxxx.so
{
      global:
             xxx_initialize();
             xxx_finalize();

      local:
             *;
}

假設libxxx.a為我們想匯出的靜態連結庫,export.sym檔案為控制靜態連結庫匯出符號檔案,檔案中所列舉的函式即為靜態庫需要匯出的符號表。
libxxx.a
{
      xxxx_initialize();
      xxxx_finalize();
}

接下來在編譯的時候需要指定引數:

對於動態連結庫:

CMakeList.txt中新增:

SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS  -Wl,--no-undefined,--version-script,${PROJECT_SOURCE_DIR}/xxx/export.map)

gcc編譯時:

gcc -shared -o libxxx.so wl, --version-script=export.map

對於靜態連結庫:

CMakeList.txt中新增:

SET_TARGET_PROPERTIES (libxxx PROPERTIES LINK_FLAGS  -Wl,--no-undefined,--retain-symbols-file,${PROJECT_SOURCE_DIR}/xxx/export.sym)

gcc編譯時:

gcc -shared -o libxxx.so wl,--retain-symbols-file=export.sym

Linux動態連結庫中使用第三方庫的時候這點需要注意,稍不小心就會crash。


相關推薦

Linux匯出符號衝突相關問題總結

在linux中使用動態連結庫進行連結時出現衝突導致crash,檢視原因是因為我們的動態連線庫中使用的protubuf版本與對方使用的版本衝突。但是我們產品中的protubuf是以靜態庫的方式鏈入,怎麼會出現版本衝突呢。谷歌了一下,究其原因是因為在Linux中會預設將所有匯入

linux相關總結

.com 新增 同一文件 識別 必須 2.6 .cn 程序 運行級別 一.在linux的世界裏,有問題問man,相當於java的api。其用法是man 你不會的命令 二.Linux系統有7個運行級別(runlevel):常用的是3和5   運行級別0:系統停機狀態,系統默認

linux下關於time相關函數的總結

取值 hour linux 原來 轉換 星期 ear 1970年1月1日 div 1. time 函數 返回1970-1-1, 00:00:00以來經過的秒數 原型: time_t time(time_t *calptr) 結果可以通過返

Linux符號總結

entos a-z each || 取反 結果 範圍 www. anti 常用符號~ 登陸用戶當前的家目錄 . 當前目錄.. 當前目錄的上一級目錄cd - 返回上一次的目錄; 命令分隔符# 表示註釋 ? 通配符中表示任意一個字符* 通配符中表

LINUX靜態庫與動態庫符號衝突問題分析與解決

1. 問題重現模型 為了重現問題並去掉無關干擾細節,我們將構建一個最簡單的可執行模組和依賴模組的關係鏈,程式依賴模型如下: 1.1 解釋 (1)有一個名為RTSP的第三方庫提供了公共介面RTSP_OPEN,RTSP可以編譯為靜態庫libRTSP_ST

linux下動態庫的符號衝突、隱藏和強制優先使用庫內符號

在同客戶做對接時遇到了符號衝突的問題。 我司為客戶提供sdk包供開發使用,就是幾個so檔案,在so檔案中我司封裝了tinyxml2這個庫,客戶再做開發時也時候用了tinyxml2這個庫,但是所使用的版本是不同的,造成了再執行時,會崩潰。應該是在程式執行時,先載入了他們的ti

Linux驅動之匯出符號

Linux 2.6的“/proc/kallsyms”檔案對應著核心符號表,它記錄了符號以及符號所在的記憶體地址。   模組可以使用如下巨集匯出符號到核心符號表: EXPORT_SYMBOL(符號名); EXPORT_SYMBOL_GPL(符號名); Module.sym

linux 特殊符號總結

1) >  1>  輸出重定向符號 重定向內容到檔案 清除已有的內容 然後加入到新內容 如果檔案不存在則建立 2) >> 1>> 追加輸出重定向符號  追加內容到檔案(中間無空格) 3) <  0<     輸入重定向   m

獲取Linux核心未匯出符號的幾種方式

從Linux核心的2.6某個版本開始,核心引入了匯出符號的機制。只有在核心中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL匯出的符號才能在核心模組中直接使用。然而,核心並沒有匯出所有的符號。例如,在3.8.0的核心中,do_page_fault就沒有被匯出。     而我的核心模組中需要

linux新建使用者,使用者組相關總結

useradd tomcat_boot #建立tomcat_boot使用者,同時會建立一個同名的工作組tomcat_boot passwd tomcat_boot #設定tomcat_boot使用者密碼 userdel tomcat_boot #刪除tomca

linux檔案許可權和git status 衝突問題總結

git關於檔案許可權修改引起的衝突及忽略檔案許可權的辦法 在釋出專案到線上時,很多時候需要修改檔案的許可權,如果是使用git版本管理軟體來發布的話,那麼下次更新線上檔案的時候就會提示檔案衝突。明明檔案沒有修改,為什麼會衝突呢?原來git把檔案許可權也算作檔案差

linux下web端預覽SD卡的相關總結

最近在弄linux下web端的SD卡內容的預覽問題,研究了一下關於SD卡由前端web到下層呼叫的相關的程式碼。在此黏貼出來分享一下。 大概思路是這樣的:在web端的程式碼是建立對話方塊顯示SD卡的內容 web端事件在boa中通過雜湊表呼叫對應的響應函式。 在應用層有對應的事

Linux的系統呼叫open,write,read,close,及相關總結

在進行C語言學習的時候我們瞭解到了C語言相關的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相關函式,他們都是由C庫函式提供的一些函式,是將作業系統的系統呼叫加以封裝,雖說Linux是由C語言實現的,但為了使我們更加的瞭解Linux,就需

linux centos 用戶權限相關總結

del lock 通過 sql shell 分開 即使 lin 當前 linux上用戶管理 以及 相應權限 查看 增加 刪除用戶 修改密碼 用戶 用戶組 用戶默認目錄 用戶shell路徑 等 用戶管理 相關文件 1. 查看系統有哪些用戶 cat /etc/passwd

python類相關總結(持續更新)

屬於 模塊 error pan 類成員 pro 相關 ror __str__ __init__   構造函數 __dict__   vars()函數,獲取命名空間裏面的名稱 __str__   str()函數,輸出成員相關信息的內容 __repr__   repl()函數,

tempdb 相關總結

find ted exe reserve man current -- query tor /* -- 0. 高速壓縮tempdb為初始值 USE tempdb DBCC SHRINKFILE(2,TRUNCATEONLY); */ -- 1. tempdb以下未

Linux 用戶管理相關命令

root sudo 1、root用戶創建用戶,同時創建 /home 下用戶目錄,將此用戶加入 sudo 組。useradd walker -m -g sudo2、root用戶創建或修改密碼。passwd walker*** walker ***本文出自 “walker的流水賬” 博客,請務必保留此出處

c/c++類型轉換相關總結

兩個指針 自動 隱式轉換 需要 const 賦值 vss 進行 結構 在c語言中存在兩種類型轉換:顯式類型轉換和隱式類型轉換;   顯示類型轉換:在類型前加上(type)變量,對變量進行的轉換,程序員自己顯式添加;   char *ptra = (char*)ptrb;  

Linux常用網絡命令總結

linuxLinux常用網絡命令總結一、手動/自動配置IP參數與氣動/關閉網絡接口:ifcofig、ifup、ifdown1、ifconfig 手動啟動、查看與修改網絡接口的相關參數,可以修改的參數有很多,包括ip參數以及MTU等。 語法:1) ifconfig interface {up|dow

Linux系統調優相關工具

應用 磁盤讀寫 系統 相關 系統調優 網絡 運行 work lin 系統調優4大子系統 實戰1:找出系統中使用CPU最多的進程? 實戰2:找出系統中使用內存最多的進程? 實戰3:找出系統中對磁盤讀寫最多的進程? 實戰4:找出系統中使用網絡最多的進程? 系統調