Ответ 1
glibc использует libnss для поддержки нескольких разных провайдеров услуг разрешения адресов. К сожалению, вы не можете статически связывать libnss, так как именно то, что он загружает, зависит от локальной конфигурации системы.
Я включил заголовок netdb.h, где включен getaddrinfo, но gcc выдает это предупреждение:
warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c
Как я могу статически компилировать любой файл?
Возможные решения:
Возможно, в установке glibc отсутствует соответствующий объектный файл, необходимый для статической компиляции. Если это так, создайте соответствующий объектный файл и привяжите его при компиляции.
Попробуйте использовать EGLIBC вместо glibc.
Я успешно скомпилировал свою программу с помощью dietlibc, которая была скомпилирована без ошибок, а полученный двоичный файл был намного меньше, чем делает glibc.
glibc использует libnss для поддержки нескольких разных провайдеров услуг разрешения адресов. К сожалению, вы не можете статически связывать libnss, так как именно то, что он загружает, зависит от локальной конфигурации системы.
Я нашел решение: вы можете использовать мусличную библиотеку для замены glibc. Чтобы использовать musl, вы можете установить его и создать свое программное обеспечение с помощью musl-gcc, или вы можете использовать дистрибутив Linux, который использует musl, например. Alpine Linux.
В моем случае, чтобы сэкономить время, я выбрал Alpine Linux для сборки моей программы (https://github.com/zhanxw/rvtests), поскольку я не хочу для создания нескольких компиляторов (gcc, g++ и gfortran).
Я думаю, что некоторые функции зависят от динамического загрузчика, чтобы работать во время выполнения. статическая связь уже не практична, к сожалению http://people.redhat.com/drepper/no_static_linking.html