Статическое связывание зависимостей общего объекта в linux - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь создать общий объект, который имеет свои собственные зависимости, статически связанные.

Вот пример:

/* File: add.c */
#include <stdio.h>

int add(int a, int b) {
  printf("Adding: %d %d\n", a, b);
  return a + b;
}

При попытке компиляции я получаю следующую ошибку :

$ 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

Работает на Ubuntu 18.04.4 LTS с gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 и GNU ld (GNU Binutils for Ubuntu) 2.30.

Мои вопросы:

  1. Как я могу заставить вышеуказанное работать?
  2. Будет ли проблема, если 2 libc будут запущены одновременно (один статически связан в моем общем объекте, а другой из гипотетического исполняемого файла, который будет связываться с моим общим объектом и библиотекой c)?

Я также нашел эту статью здесь , в которой освещается похожая проблема, но без решения.

1 Ответ

0 голосов
/ 18 июля 2020

Как я могу заставить вышеуказанное работать?

Нормальная сборка libc.a не имеет -fPIC. На i386 вы можете связать не-PI C объектные файлы с .so, но результатом будет .so, требующий перемещения текста (.text таких .so не может быть передано между процессами).

Но на x86_64 вы не можете (перемещения имеют только 4 байта в средней модели памяти, и вам нужно будет переместить .text более чем на +/- 2 ГБ).

Итак, чтобы эта работа работала, вы должны перестроить libc.a с -fPIC.

Будет ли проблема, если 2 библиотеки запущены одновременно (одна статически связана в моем общем объекте и один из гипотетического исполняемого файла, который будет связываться с моим общим объектом и библиотекой c)?

Большинство вещей будет работать, но TLS может вызвать сложности.

...