Компиляция с -статический-на libgcc -статический-с libstdc++ все-таки результаты в динамической зависимости от версии libc.так
Я пытаюсь сделать исполняемый файл максимально переносимым. После удаления нескольких зависимостей я наткнулся на следующее при запуске двоичного файла в другой системе:
/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by foob)
Я бы предпочел, чтобы мой двоичный файл не требовал от пользователя обновления своей версии libc, поэтому я хотел бы удалить эту зависимость.
флаги компоновщика, которые произвели вышеупомянутый двоичный файл, уже включены -static-libgcc -static-libstdc++
. Почему двоичный файл по-прежнему требует общие библиотеки libc.так.6?
Я пробовал добавлять -static
флаг, однако, когда я пытаюсь запустить это двоичный результат очень странный:
$ ls -l foob
-rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob
$ ./foob
bash: ./foob: No such file or directory
Что делать?
EDIT:
$ file foob
foob: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5adee9a598b9261a29f1c7b0ffdadcfc72197cd7, not stripped
$ strace -f ./foob
execve("./foob", ["./foob"], [/* 64 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1) = ?
+++ exited with 1 +++
интересно, если я ldd
версия без -static
, он имеет два меньше записи, чем версия с -static
, а именно:
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f420c1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f41636000)
2 ответов
GNU libc не предназначен для статической связи. Важные функции, например gethostbyname
и iconv
, будет неисправен или не будет работать вообще в статическом двоичном файле. Возможно, даже хуже, при некоторых условиях статический двоичный файл будет попытка динамически открыть и использовать libc.so.6
, хотя весь смысл статической связи заключается в том, чтобы избежать таких зависимостей.
вы должны скомпилировать свою программу против uClibc или musl библиотеки libc вместо.
(Это верно, по крайней мере, 15 лет.)
сначала имейте в виду, что статическое связывание libc может не улучшить переносимость вашей программы, так как libc может зависеть от других частей вашей системы, например версии ядра.
Если вы хотите попробовать полную статическую привязку, просто используя-static должен трюк. При условии, что установлены статические версии всех используемых библиотек.
вы можете проверить, имеет ли ваша программа только связанные статические библиотеки использование:
ldd binary_name
EDIT:
другим способом, который предоставляет полезную информацию для отладки этой проблемы, было бы добавить --verbose к флагам компоновщика.