Соответствие версии общей библиотеки Linux - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть 2 машины, одна из них - Ubuntu 16.04, на которой установлена ​​libc-2.23. еще один redhat 7, версия libc 2.17

Следующая простая программа скомпилирована на Ubuntu и может хорошо работать на Redhat 7.

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
  printf("hello world\n");
  double n = 4;
  printf("%e\n", sqrt(n));
  return 0;
}

но когда я компилирую mongodb в ubuntu и отправляю бинарный файл в redhat 7, я получаю следующую ошибку.

[zhifan@rhel-2372970 ~]$ ldd mongod
./mongod: /lib64/libm.so.6: version `GLIBC_2.23' not found (required by ./mongod)
        linux-vdso.so.1 =>  (0x00007ffd4313a000)
        libm.so.6 => /lib64/libm.so.6 (0x00007faaf5eb4000)
        librt.so.1 => /lib64/librt.so.1 (0x00007faaf5cac000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007faaf5aa7000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007faaf5891000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007faaf5675000)
        libc.so.6 => /lib64/libc.so.6 (0x00007faaf52b1000)
        /lib64/ld-linux-x86-64.so.2 (0x0000564cf2068000)

Итак, мои вопросы:

  1. Как при запуске двоичного файла загрузчик библиотеки решает, какую библиотеку (в данном случае libc) можно использовать?
  2. Я уверен, что точно такая же версия mongod (которая построена mongo inc) может работать с libc-2.17, но почему моя сборка не может работать с libc-2.17?

1 Ответ

0 голосов
/ 28 апреля 2018

Как при запуске двоичного файла загрузчик библиотеки решает, какую библиотеку (в данном случае libc) можно использовать?

Ищет версии символов, которые требуются приложению. Если все необходимые символы доступны, если библиотека в порядке.

Вы можете увидеть, какие символы необходимы, запустив readelf -V a.out.

почему моя сборка не может работать с libc-2.17

Когда вы связываете свой двоичный файл с GLIBC-2.23, вы можете использовать определения символов из этой версии. Эти символы имеют другой ABI по сравнению с более ранней версией и поэтому не могут использовать более раннюю версию.

Чтобы избежать этого, вы должны либо построить на более старой системе (двоичный файл будет работать на более новой системе просто отлично - он будет использовать более старый символ ABI), либо вы должны собрать Linux-старше. -Linux кросс-компилятор (который заставит ваш двоичный файл использовать более старый ABI).

...