2016-07-26 60 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; 
}