编译共享库时出错

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;
}