Как разрешить компиляцию статического двоичного кода, в код которого входит функция 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
, будет выводиться следующим образом:
поиск: ELF 32-разрядный исполняемый файл LSB, Intel 80386, версия 1 (GNU/Linux), статически связанный, для GNU/Linux 2.6.24, BuildID [sha1] = 0x6fcb2684ad8e5e842036936abb50911cdde47c73, не раздевается
Не так:
поиск: ELF 32-разрядный исполняемый файл LSB, Intel 80386, версия 1 (SYSV), динамически связан (использует общие библиотеки), для GNU/Linux 2.6.24, BuildID [sha1] = 0xf9f18671751927bea80de676d207664abfdcf5dc, не раздевается
Если вы прокомментировали предложенное, я должен использовать его без статики, потому что каждый libc каждый linux я знал это, надеюсь, вам не нужно комментировать. Почему я настаиваю на статике? Поскольку мне нужно сделать обязательное использование static, двоичные файлы должны быть статичными, а не динамическими.
У меня есть более 2 недель, чтобы найти это, но до сих пор не удалось.
Спасибо, что помогли мне решить мою тяжелую проблему.