#c #linux #gcc
#c #linux #gcc
Вопрос:
Мне нужно запустить мою программу в другом дистрибутиве Linux, в котором не установлена библиотека mudflap и установлена другая версия glibc. Я пытался скомпилировать свою программу с помощью -static, но это невозможно:
предупреждение: Использование 'getaddrinfo' в статически связанных приложениях требует во время выполнения общих библиотек из версии glibc, используемой для связывания
Итак, я пытаюсь -nostdlib и подключаю библиотеки вручную, но получаю эти ошибки:
myuser@linux: ~/Desktop $ gcc -nostdlib -Wl,-dynamic-linker,/home/myuser/Desktop/ld-linux-x86-64.so.2,-rpath,/home/myuser/Desktop /home/myuser/Desktop/libc.so.6 -fmudflap /home/myuser/Desktop/libmudflap.so.0 /home/myuser/ Desktop/libdl.so.2 simple.c мой пользователь@linux:~/Desktop $ ./a.out mf: dlsym("mmap") = NULL Прервано (сброшено ядро) мой пользователь@linux:~/Desktop$ ldd a.out linux-vdso.so.1 => (0x00007fff2bad2000) libc.so.6 => /home/myuser/Desktop/libc.so.6 (0x00007fddfd521000) libmudflap.so.0 => /home/myuser/Desktop/libmudflap.so.0 (0x00007fddfd175000) libdl.so.2 => /home/myuser/Desktop/libdl.so.2 (0x00007fddfcf70000) /home/myuser/Desktop/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fddfd884000) мой пользователь@linux: ~/ Desktop $
- Какой ld действительно используется? Тот, что на моем рабочем столе, или тот, что в / lib64?
- Какие еще флаги должны быть включены, чтобы обеспечить правильную компиляцию?
Комментарии:
1. Есть ли причина, по которой вы используете mudflap в программе, которую развертываете на других компьютерах? Это инструмент отладки…
Ответ №1:
Вместо того, чтобы пытаться связать библиотеки статически, перенесите их в свой исполняемый файл и укажите либо LD_LIBRARY_PATH, либо rpath на каталог, содержащий их.
Но никогда не переносите libc, если вы связываете свою программу с более старой версией libc, вы должны быть в безопасности. Это означает, что вам нужно скомпилировать ваше приложение в среде, которая либо старше, либо точно такая же, как целевые системы.
Возможно, вам удастся обойтись более новой системой, если вы не используете символы, которые получили обновления версий между компиляцией и целевой системой.
Статическое связывание, к сожалению, намного сложнее, чем кажется.
Ответ №2:
Не так уж и сложно. Используйте strace, чтобы узнать, на какие библиотеки ссылаются ваши двоичные файлы.
gcc -Xlinker -rpath=/путь/к/предоставленным/библиотекам -Xlinker -I/путь/к/предоставленному/компоновщику/ld-2.11.2.so -std=c99 -D_POSIX_C_SOURCE=200112L -fmudflap /путь/к/предоставленным/mudflap/libmudflap.so.0 simple.c