コンパイルされた静的ライブラリ内から外部文字列配列を呼び出すプログラムを作成しています。 の64ビットでプログラムをコンパイルして実行すると問題なく動作します。しかし、* 32ビット*でコードをコンパイルするときに外部配列を呼び出そうとすると、main
を実行するとSegmentation Faultが発生します。ここで外部文字列呼び出しが原因でSegfaultが32ビットで動作し、64ビットで動作する
はコードです:
ヘッダー宣言「hoenyB_lib.h:
#ifndef HONEYB_LIB_H_
#define HONEYB_LIB_H_
#include <string>
extern std::string honeyB_libs[];
#endif
エクスターナル定義HoneyB_lib.cpp:
#include <string>
std::string honeyB_libs[] = { "libHoneyB.so", "libHoneyB3.so", "libHoneyB2.so", "" };
エクスターナル使用HoneyB_fcn.cpp:
deque<string> get_array()
{
deque<string> dst;
int i =0;
for(;;)
{
if(honeyB_libs[i] == "")
break;
else
{
dst.push_front(honeyB_libs[i]);
i++;
}
}
return dst;
}
これをコンパイルするMakefileは次のようになります。
all:
$(CC) -c -Wall -fPIC source.cpp
$(CC) -g -c -fPIC honeyB_fcn.cpp
ar rcs libHB.a honeyB_fcn.o
g++ -g -c -fPIC honeyB_lib.cpp
g++ --whole-archive -shared -o libHoneyB.so source.o honeyB_lib.o libHB.a
g++ -L. -o main main.cpp -lHoneyB
これはmain()が呼び出されても問題なく動作します。しかし、私は、次のと32ビットとしてコンパイルする場合:
all32:
$(CC) -m32 -c -Wall -fPIC source.cpp
$(CC) -m32 -g -c -fPIC honeyB_fcn.cpp
ar rcs libHB.a honeyB_fcn.o
g++ -m32 -g -c -fPIC honeyB_lib.cpp
g++ --whole-archive -m32 -shared -o libHoneyB.so source.o honeyB_lib.o libHB.a
g++ -m32 -L. -o main main.cpp -lHoneyB
コードは、セグメンテーション違反を与えます。 honeyB_fct.cpp
〜honeyB_libs[]
でコールを削除すると、コードがコンパイルされて実行されます。
これがなぜの32ビットで失敗するのか誰も知りませんが、で動作しますか?
ありがとうございます。
'get_array'の呼び出しはどこですか? –