2016-11-03 9 views
2

私はプロセスAプロセスが変数を定義していないが、共有ライブラリのextern変数として使用されている場合はどうなりますか?

可変g_test_variable定義しかし、私は、プロセスBにおける変数g_test_variableを定義しない場合

common_add.soと呼ばれる2つの工程AおよびBプロセス共有同じ共有オブジェクト・ファイルの両方を有し、 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(工程Aで実行されている)とプログラムBB(工程Bで実行されている)を持っています。どちらも、AAは(いくつかのグローバルELFシンボルテーブルに)シンボルg_test_variableを定義していない場合common_add.so

しかし、そのcommon_add.sodynamic linkingが失敗する使用しています。

どのように起こるかは、ダイナミックリンクの仕方によって異なります。

dlopen(3)を使用している場合は、遅延接続を避けるために、RTLD_NOWを渡すことをお勧めします。それでdlopenは失敗し、dlerrorは役に立つメッセージを与えています。

あなたはdlopenにデフォルトRTLD_LAZYを渡すと、エラーがadd_intの最初の呼び出し時に、あるいはadd_double一見無関係にのみトリガーする(しかし、詳細は実装と異なる場合があります)ことが起こりでき

(ありません

thisも参照してDreppeを読む)common_add.soプラグインの-fPICcommon.c、コンパイラ、および-rdynamicとの両方のメインaa & bbプログラムをリンクすることを忘れrのHow To Write Shared Libraries用紙。

私はを使用して、早い時期にdlopenそのようなエラーをキャッチすることをお勧めします。もちろん、未定義のシンボルが参照されている場合、プログラムが動作することは期待できません! (したがって、メインプログラムでg_test_variableを定義する必要があります...)。 g_test_variableをプラグインにweak symbolとして宣言することもできます(ただし、一般的にこのような方法はお勧めしません)。

関連する問題