Làm thế nào để giải quyết biên dịch một nhị phân tĩnh mà mã bao gồm một chức năng GetHostByName và nếu biên soạn mà không cần cảnh báo như thế này:Biên soạn một nhị phân tĩnh mà mã có một chức năng GetHostByName
cảnh báo: Sử dụng 'GetHostByName' trong các ứng dụng liên kết tĩnh đòi hỏi trong thời gian chạy các thư viện được chia sẻ từ các phiên bản glibc sử dụng để liên kết
tôi biên dịch trên ubuntu 12.04 với lệnh:
$ gcc -static lookup.c -o lookup
Đây là mã cho 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;
}
tôi muốn nếu tôi kiểm tra qua $ file lookup
sẽ nhận được kết quả như thế này:
tra cứu: ELF 32-bit LSB thực thi, Intel 80386 , phiên bản 1 (GNU/Linux), liên kết tĩnh, cho GNU/Linux 2.6.24, BuildID [sha1] = 0x6fcb2684ad8e5e842036936abb50911cdde47c73, chưa bóc
Không thích này:
tra cứu: ELF 32-bit LSB thực thi, Intel 80386, phiên bản 1 (SYSV), (libs sử dụng được chia sẻ) liên kết động, cho GNU/Linux 2.6.24, BuildID [ sha1] = 0xf9f18671751927bea80de676d207664abfdcf5dc, chưa bóc
Nếu bạn nhận xét với đề nghị tôi phải sử dụng mà không tĩnh vì libc khác nhau mỗi linux tôi biết điều đó, tôi hy vọng bạn không cần phải bình luận. Tại sao tôi vẫn tồn tại trong tĩnh? Vì ở đó tôi cần phải thực hiện các tệp nhị phân tĩnh, bắt buộc phải tĩnh và không động.
Tôi có hơn 2 tuần tìm kiếm điều này nhưng cho đến nay vẫn chưa thành công.
Cảm ơn bạn đã giúp tôi giải quyết vấn đề nặng nề của mình.
Tóm lại: không liên kết tĩnh một chương trình như vậy. Liên kết nó theo cách động, như thường lệ, với 'libc.so' –
Hello Basile của bạn. Tại sao? –
Cách thực hiện? cái gì với -Bdynamic -lc -Wl? –