純粋な C、RHEL 5.5 x64、gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-48) でいくつかのコードを書いています。
2 つの静的ライブラリを使用してコンパイルされた実行可能ファイルがあります。それらのそれぞれは、いくつかのグローバルな(特定のライブラリの)配列変数を使用します(つまり、ある.cファイルで
char var1[VAR_SIZE1];
.cファイルを使用し、次に使用するライブラリの他の.cファイルでextern char var1[VAR_SIZE1];
、2番目のライブラリと同じ状況です)。各ライブラリは、実行可能なソース ディレクトリの独自のサブディレクトリに配置されます。あるライブラリがそのデータを別のライブラリのメモリに配置できることに気付き始めました。何が起こっているのかを知るために、3 番目の lib の変数の 1 つに void ポインターを定義し (lib 3 は問題の両方の lib で使用されます)、このポインターに lib1 のアドレスを割り当て、lib2 のアドレスを調べました。私が今見ているのは:
char var1[1000]; /*please mind the length*/
extern void* ptr_to_var2;
printf("var1 addr is %p, var2 addr is %p\n", (void*)&var1, ptr_to_var2);
このコードは生成します
var1 アドレスは 0xa11b00、var2 アドレスは 0xa11e00
ご覧のとおり、var1 はアドレス 0xa11ee8 に配置され、var2 のヘッドは var1 メモリ内にあります。私は何を間違っていますか?静的ライブラリでグローバル変数を使用する際に制限はありますか? これらの変数は、各ライブラリ内の多数のファイルで使用されているため、静的として定義することはできません。これらの変数を動的にするのは大変な作業です (そのような変数は数十あります)。
PS もちろん、ptr_to_var2 は初期化されます。本当に何が起こっているのか
<lib3>
void* ptr_to_var2;
<lib2>
#include "hdr_with_my_struct_name_definition.h"
my_struct_name var2[5];
extern void* ptr_to_var2;
int func2(){
ptr_to_var2=(void*)&var2;
var2[0].fld1=12345;
return 1;
}
<lib 1>
#include "hdr_with_my_struct_name_definition.h"
char var1[1000];
extern void* ptr_to_var2;
int func1(){
my_struct_name *temp_var_2=(my_struct_name*)ptr_to_var2;
printf("%d", temp_var_2[0].fld1);
memset(var1, '\0', sizeof(var1);
printf("%d", temp_var_2[0].fld1);
return 1;
}
<binary>
main(){
func2();
func1();
return;
}
このすべてが 12345 0 を返します