Создать статически связанный двоичный файл, который использует getaddrinfo?

Я включил заголовок 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

Как я могу статически скомпилировать отсутствующий файл?

Возможные решения:

  1. Возможно, в установке glibc отсутствует соответствующий объектный файл, необходимый для статической компиляции. Если это так, создайте соответствующий объектный файл и свяжите его при компиляции.

  2. Попробуйте EGLIBC вместо glibc.

  3. Я успешно скомпилировал свою программу с dietlibc, которая скомпилировалась без каких-либо ошибок, плюс полученный двоичный файл был намного меньше, чем то, что делает glibc.


person Neeladri Vishweswaran    schedule 27.04.2010    source источник
comment
Я бы сделал ваши возможные решения ответом. Тогда вы можете принять свой собственный ответ.   -  person Lucas    schedule 18.05.2010


Ответы (3)


glibc использует libnss для поддержки ряда различных поставщиков услуг разрешения адресов. К сожалению, вы не можете статически связать libnss, так как именно то, какие поставщики загружаются, зависит от конфигурации локальной системы.

person bdonlan    schedule 21.06.2010
comment
Между тем, в версии 2.20 есть флаг --enable-static-nss для configure, который, кажется, делает именно это. Обратите внимание, что статическая ссылка создает некоторые недостатки (см. ответ @pixelbeat и комментарии к нему). - person Karl Richter; 20.09.2014
comment
Я нашел решение, использующее musl вместо glibc. См. мой ответ ниже: stackoverflow.com/a/37245653/425758 - person zhanxw; 16.05.2016

Я нашел решение: вы можете использовать библиотеку musl для замены glibc. Чтобы использовать musl, вы можете либо установить его и собрать свое программное обеспечение с помощью musl-gcc, либо вы можете использовать дистрибутив Linux, который использует musl, например. Альпийский линукс.

В моем случае, чтобы сэкономить время, я выбрал Alpine Linux для сборки своей программы (https://github.com/zhanxw/rvtests), так как я не хочу создавать несколько компиляторов (gcc, g++ и gfortran).

person zhanxw    schedule 16.05.2016
comment
Вы знаете решение для C++? - person JC1; 13.10.2017
comment
Спасибо. Знаете ли вы, переносимы ли бинарные файлы, скомпилированные в Alpine? Я создаю двоичный файл для запуска в качестве лямбды на Amazon AWS, и я думаю, что настоятельно рекомендуется скомпилировать его в CentOS (ОС, используемая для лямбда-выражений). - person JC1; 13.10.2017
comment
@ JC1 Да, я скомпилировал Alpine Linux и могу запустить его на Ubuntu 16.04 и CentOS7. - person zhanxw; 14.10.2017

Я думаю, что некоторые функции зависят от динамического загрузчика, чтобы работать во время выполнения. к сожалению, статические ссылки больше не применимы http://people.redhat.com/drepper/no_static_linking.html

person pixelbeat    schedule 27.04.2010
comment
Я думаю, это зависит от того, что вам нужно сделать. Статическая компиляция является допустимым решением, если бинарная переносимость является обязательной. - person Neeladri Vishweswaran; 07.05.2010
comment
Ну, выше упоминается, что некоторые вещи невозможны, если вы используете статическую ссылку. У меня есть несколько замечаний по бинарной совместимости здесь: pixelbeat.org/programming/linux_binary_compatibility.html - person pixelbeat; 07.05.2010