2016-11-03 16 views
2

我有2過程A和稱爲B.兩個進程共享相同的共享對象文件common_add.so如果我的進程沒有定義一個變量,但是它被用作共享庫中的一個外部變量,會發生什麼?

我定義在處理A的可變g_test_variable

但是,如果我不限定於處理B的可變g_test_variable和使用dlopen &對dlsym打開common_add.so文件並調用它不使用g_test_variable變量add_double功能,將我打什麼問題?

/* 
* File Name : common.c 
* This file packaged as part of common_add.so 
*/ 
extern int_32 g_test_variable; //declaration 
int add_int(int a, int b) 
{ 
    if(g_test_variable) 
     printf("somthing"); 

     return a+b; 
} 

double add_double(double a, double b) 
{ 
     return a-b; 
} 
+0

這就是我所說的過度註釋代碼;-) – Bathsheba

+0

@Bathsheba :)。抱歉。修改了代碼。 –

+0

進程正在運行(某些可執行程序)。他們沒有定義變量。變量僅在源代碼級別存在。 –

回答

1

(我說的是Linux系統)

所以,你有一個程序AA(過程正在運行)和節目BB(工藝B上運行)。兩者都使用common_add.so

但如果AA沒有定義(在一些全球ELF符號表)符號g_test_variablecommon_add.sodynamic linking會失敗。

如何以及何時發生這種情況可能依賴於動態鏈接是如何完成的。

如果您正在使用dlopen(3)你會更好地傳遞RTLD_NOW避免遲緩鏈接。然後dlopen會失敗,並且dlerror正在提供有用的消息。

如果你通過了默認RTLD_LAZYdlopen是可能發生的錯誤會觸發僅在第一次調用add_int甚至在明顯無關的add_double(但細節可能與實現方式會發生變化)

(不忘了-fPIC到編譯器common.ccommon_add.so插件,並與-rdynamic鏈接兩個主aa & bb程序)

參見this和閱讀Dreppe r的How To Write Shared Libraries紙。

我建議使用RTLD_NOW趕上早期dlopen一次這樣的錯誤。當然,如果一個未定義的符號被引用,你不能期望程序能夠工作! (所以你應該要求主程序定義g_test_variable ...)。你可以考慮宣佈你g_test_variableweak symbol在插件(但我一般不推薦這樣的技巧)。

相關問題