Создать статически связанный бинарный файл, который использует getaddrinfo? - PullRequest
27 голосов
/ 28 апреля 2010

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

Ответы [ 3 ]

20 голосов
/ 21 июня 2010

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

6 голосов
/ 16 мая 2016

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

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

1 голос
/ 28 апреля 2010

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

...