【问题标题】:Error while compiling a shared library编译共享库时出错
【发布时间】:2016-07-26 07:47:06
【问题描述】:

使用 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

【问题讨论】:

  • myglob 是否在图书馆外使用?你试过static吗?
  • 你看看我是否使用gcc code.c -o libcode.so -shared 编译它会成功编译但是如果我尝试创建一个目标文件然后创建共享库它会出错!
  • 本题背景是学习Load-time relocation

标签: c gcc shared-libraries


【解决方案1】:

在 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

【讨论】:

  • 不,我不能使用 -fPIC,因为我必须分析加载时间重定位。
  • 我错过了那部分。更新了答案。
【解决方案2】:

如果myglob 没有在库中的代码之外使用,您可以为变量指定static 存储类。 static 全局变量将位于 BSS 段中。

例子:

static int myglob = 42;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多