Gcc 在linux中静态链接共享对象的依赖项
我试图创建一个共享对象,它有自己的静态链接的依赖项 以下是一个例子:Gcc 在linux中静态链接共享对象的依赖项,gcc,shared-libraries,static-libraries,static-linking,dynamic-linking,Gcc,Shared Libraries,Static Libraries,Static Linking,Dynamic Linking,我试图创建一个共享对象,它有自己的静态链接的依赖项 以下是一个例子: /* File: add.c */ #include <stdio.h> int add(int a, int b) { printf("Adding: %d %d\n", a, b); return a + b; } 使用gcc(Ubuntu 7.5.0-3ubuntu1~18.04)7.5.0和GNU ld(用于Ubuntu的GNU Binutils)2.30运行 我的问题是:
/* File: add.c */
#include <stdio.h>
int add(int a, int b) {
printf("Adding: %d %d\n", a, b);
return a + b;
}
使用gcc(Ubuntu 7.5.0-3ubuntu1~18.04)7.5.0
和GNU ld(用于Ubuntu的GNU Binutils)2.30运行
我的问题是:
我如何才能使上述工作
如果2libc
s同时运行(一个静态链接到我的共享对象中,另一个来自将链接到我的共享对象和libc的假设可执行文件),这会是一个问题吗
我还发现这篇文章强调了一个类似的问题,但没有解决方案
我如何才能使上述工作
libc.a
的正常构建没有-fPIC
。在i386
上,您实际上可以将非PIC对象文件链接到.so
,但结果将是.so
,这需要文本重新定位(.text
这样的。因此
不能在进程之间共享)
但是在x86_64
上,您不能这样做(在中等内存模型中,重定位只有4个字节,您需要将.text
重定位+/-2GiB以上)
因此,要使其正常工作,必须使用-fPIC
重建libc.a
如果两个libc同时运行(一个静态链接在我的共享对象中,另一个来自将链接到我的共享对象和libc的假设可执行文件),这会是一个问题吗
大多数事情都会成功,但TLS可能会导致复杂性。您只能将glibc的静态版本链接到静态可执行文件。看见也读。不管你的问题是什么,静态链接可能不是一个解决方案。谢谢!你能详细说明一下我对TLS可能存在的问题吗?另外,是否有一种简单的方法可以使用-fPIC
安装libc
?是否有现成的软件包可与apt一起安装?
$ gcc -g -shared -fPIC -o libadd.so add.c -Wl,-Bstatic -lc -Wl,-Bdynamic
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libc.a(malloc.o): relocation R_X86_64_TPOFF32 against `tcache' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libc.a(libc_fatal.o): relocation R_X86_64_PC32 against symbol `_dl_pagesize' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status