Как разрешить компиляцию статического двоичного кода, код которого включает функцию gethostbyname, и если он скомпилирован без предупреждения, например:
предупреждение: использование gethostbyname в статически связанных приложениях требует во время выполнения разделяемых библиотек из версии glibc, используемой для компоновки
Я компилирую Ubuntu 12.04 с помощью команды:
$ gcc -static lookup.c -o lookup
Это код для lookup.c:
/* lookup.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
extern int h_errno;
int main(int argc,char **argv) {
int x, x2;
struct hostent *hp;
for ( x=1; x<argc; ++x ) {
hp = gethostbyname(argv[x]);
if ( !hp ) {
fprintf(stderr,
"%s: host '%s'\n",
hstrerror(h_errno),
argv[x]);
continue;
}
printf("Host %s : \n" ,argv[x]);
printf(" Officially:\t%s\n", hp->h_name);
fputs(" Aliases:\t",stdout);
for ( x2=0; hp->h_aliases[x2]; ++x2 ) {
if ( x2 ) {
fputs(", ",stdout);
}
fputs(hp->h_aliases[x2],stdout);
}
fputc('\n',stdout);
printf(" Type:\t\t%s\n",
hp->h_addrtype == AF_INET
? "AF_INET" : "AF_INET6");
if ( hp->h_addrtype == AF_INET ) {
for ( x2=0; hp->h_addr_list[x2]; ++x2 ) {
printf(" Address:\t%s\n",
inet_ntoa( *(struct in_addr *)
hp->h_addr_list[x2]));
}
}
putchar('\n');
}
return 0;
}
Я хочу, чтобы, если я проверю через $ file lookup
, получится такой вывод:
поиск: 32-разрядный исполняемый файл LSB ELF, Intel 80386, версия 1 (GNU / Linux), статически связанный, для GNU / Linux 2.6.24, BuildID [sha1] = 0x6fcb2684ad8e5e842036936abb50911cdde47c73, без удаления
Не так:
поиск: 32-разрядный исполняемый файл LSB ELF, Intel 80386, версия 1 (SYSV), динамически связанный (использует общие библиотеки), для GNU / Linux 2.6.24, BuildID [sha1] = 0xf9f18671751927bea80de676d207664abfdcf5dc, без удаления
Если вы прокомментировали с предложением, что я должен использовать без статики, потому что разные libc в каждом Linux, который я знал, я надеюсь, вам не нужно комментировать. Почему я упорствую в статике? Поскольку там мне нужно обязательно использовать статические, двоичные файлы должны быть статическими, а не динамическими.
Я искал это более 2 недель, но пока не удалось.
Спасибо за помощь в решении моей тяжелой проблемы.
libc.so
- person Basile Starynkevitch   schedule 01.03.2013/etc/nsswitch.conf
используетdlopen
вместоgethostbyname
, поэтому нужна динамически связанная программа (потому что там должен быть динамический компоновщик). Просто скомпилируйте сgcc -Wall -g -O lookup.c -o lookup
, и вашlookup
будет динамически связан. - person Basile Starynkevitch   schedule 02.03.2013