编译共享库时出错
Error while compiling a shared library
我正在尝试使用 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
。
在 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。
如果 myglob
未在库中的代码之外使用,您可以为变量指定 static
存储 class。 static
全局变量将位于 BSS
段中。
示例:
static int myglob = 42;
int ml_func(int a, int b)
{
myglob += a;
return b + myglob;
}
我正在尝试使用 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
。
在 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。
如果 myglob
未在库中的代码之外使用,您可以为变量指定 static
存储 class。 static
全局变量将位于 BSS
段中。
示例:
static int myglob = 42;
int ml_func(int a, int b)
{
myglob += a;
return b + myglob;
}