2016-07-26 32 views
0

gccを使用しています。x86_64システム上で共有ライブラリを作成しようとしています。コード共有ライブラリのコンパイル中にエラーが発生しました

int myglob = 42; 

int ml_func(int a, int b) 
{ 
    myglob += a; 
    return b + myglob; 
} 

gcc -c -g code.c -o code.oでそれをコンパイルしてからgcc -shared code.o -o libcode.soさは、エラーがスローされます!

エラーは/usr/bin/ld: libconst.o: relocation R_X86_64_PC32 against symbol 'myglob' can not be used when making a shared object; recompile with -fPICです。

-fPICフラグでコンパイルしようとしましたが、同じエラーが発生します。

注:ライブラリでの読み込み時の移転を確認しようとしていますので、フラグ-fPICを使用してください。

+0

は 'ライブラリーの外で使用myglob'のですか?静的にしようとしましたか? – dvhh

+0

'gcc code.c -o libcode.so -shared'でコンパイルしても正常にコンパイルされますが、オブジェクトファイルを作成して共有ライブラリを作成しようとすると、エラーが発生します。 – ashish

答えて

0

x86_64アーキテクチャでは、gccでは-fPIC(位置独立コード)を使用する必要があります。これは、シンボルrandの再配置タイプがR_X86_64_PC32タイプであるためです。あなたができることは、使用-mcmodel=largeで、再配置タイプをR_X86_64_64に設定します。

gcc -g -mcmodel=large -c code.c -o code.o 
gcc -shared -o libcode.so code.o 

もっとよく説明されているhere

+0

いいえロード時間の再配置を分析する必要があるため、-fPICを使用できません。 – ashish

+0

私はその部分を逃した。更新された答え。 – aebudak

+0

ありがとうございます! – ashish

0

myglobがライブラリ内のコードの外側で使用されていない場合は、その変数にstaticストレージクラスを指定できます。グローバル変数staticBSSセグメントに配置されます。

例:

static int myglob = 42; 

int ml_func(int a, int b) 
{ 
    myglob += a; 
    return b + myglob; 
} 
関連する問題