LD:将共享库链接到静态库

时间:2017-12-15 10:28:38

标签: c gcc ld

我正在尝试将static libraryshared library相关联,这会让我误以为recompile with -fPIC

这是我尝试过的一个例子:

savari@Ramana:~/Junk$ cat common.h 
#include <stdio.h>
#include <stdlib.h>

void func1(int *p);
void func2();

共享库代码:

savari@Ramana:~/Junk$ cat shared.c 
#include "common.h"

void func2()
{
    int i=10;
    func1(&i);
}

静态库代码:

#include "common.h"

int k;

void func1(int *p)
{
    printf("%d\n", *p);
}

现在,请看共享库使用静态库的API。

以下是我的编译方式:

gcc -c static.c

ar rcs libStatic.a static.o

gcc -c shared.c

gcc -shared -fPIC -o libShared.so shared.o  -L. -lStatic

在最后一个命令之后,我收到以下错误:

/usr/bin/ld: ./libStatic.a(static.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
./libStatic.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

我实际上是从供应商处获得了static library,我正在尝试在其上构建shared library。我没有静态库的来源。

我得到其他类型的错误说:

relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
error adding symbols: Bad value
collect2: error: ld returned 1 exit status

我经历了这么多文章,但无法弄明白。请帮我解决这个问题。

参考文献:

Reference-1

Reference-2

2 个答案:

答案 0 :(得分:0)

在上面的示例中,您需要在编译静态库的目标文件时使用-fPIC。如果省略此选项,则编译的代码无法包装到共享对象中。如果您只有静态库而没有源代码,则无法对此进行任何操作。要求库的创建者为您提供启用-fPIC的编译。

答案 1 :(得分:0)

尝试此操作以静态链接libStatic.a:

gcc -shared -fPIC -o libShared.so shared.o  -L. -Wl, -Bstatic -lStatic