2011-01-28 48 views
4

我移植的ODBC駕駛員WindowsLinux
驅動程序寫在C
的方式ODBC作品上Linux是,應用程序對一個ODBC管理器(ODBCM),這反過來加載相應的驅動程序並傳遞函數調用的調用。功能名稱衝突在共享對象

假設我的驅動程序被編譯到共享對象中,它暴露了兩個函數AB
什麼是應該發生的是ODBCM是調用函數A,和功能A是調用函數B
什麼是實際發生的是,當函數A調用函數B代替函數B'(其具有相同的名稱作爲B,位於libodbc共享對象,並通過使用Linux應用ODBC加載)被調用。

我覺得自己好像應該是編譯時間標誌,或後編譯庫修改工具,將解決此問題。
目前我經歷的庫中的一個函數在同一時間執行以下操作:

_B(){ // rename old functions 
    ... 
} 
B() { // add new wrapper function 
    return _B(); // which just calls old 
} 

_A() { 
    ... 
    _B(); // Change calls to renamed functions 
    ... 
} 

這是緩慢的改變,感覺缺憾。

回答

6

嘗試鏈接您的.so-Bsymbolic鏈接器選項(在gcc命令行上通過-Wl,-Bsymbolic)。這會在鏈接時綁定所有庫內部的符號,以便以後不會進行任何動態鏈接。

+0

這解決了問題!謝謝,爲我節省了大量的時間手動重命名函數和編寫包裝。 – TheGeneral 2011-01-28 19:15:41