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运行

我的问题是:

  • 我如何才能使上述工作
  • 如果2
    libc
    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