2016-07-26 82 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,因爲我必須分析加載時間relocaton。 – ashish

+0

我錯過了那部分。更新了答案。 – aebudak

+0

謝謝你的作品! – ashish

0

如果myglob未在庫的代碼之外使用,則可以指定變量的static存儲類。全局變量static將位於BSS段。

實施例:

static int myglob = 42; 

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