2011-02-28 5 views
2

날 tcp.h 사용이 간단한 C 프로그램을 컴파일 도움말? "# ifdef __FAVOR_BSD"로 바이트 순서가 설정되어 있지 않기 때문에 "mitmc.c : 82 : error : struct tcphdr에 th_off라는 멤버가 없습니다."endianess의 오류로 인해 tcp.h로 간단한 프로그램을 컴파일 할 수 없습니까?

이것은 약간의 문제입니다. 난 책에서 중간 유틸리티에 this 프로그램, 간단한 사람을 컴파일하려고합니다. 리눅스에서 gcc로 컴파일하기 (Windows는 posix 라이브러리를 가지고 있지 않기 때문에).

먼저이 오류가있어 :

mitmc.c: In function âcorrupt_ip_pktâ: 
mitmc.c:82: error: âstruct tcphdrâ has no member named âth_offâ 
mitmc.c:109: error: âstruct udphdrâ has no member named âuh_ulenâ 

을하며이 때문에 "/usr/include/netinet/tcp.h"th_off는 정의에 보이는 # __FAVOR_BSD

IFDEF

경우

$ gcc mitmc.c 
/tmp/ccuzRcNp.o: In function `corrupt_ip_pkt': 
mitmc.c:(.text+0x15f): undefined reference to `libnet_do_checksum' 
mitmc.c:(.text+0x174): undefined reference to `libnet_geterror' 
mitmc.c:(.text+0x231): undefined reference to `libnet_do_checksum' 
mitmc.c:(.text+0x242): undefined reference to `libnet_geterror' 
mitmc.c:(.text+0x296): undefined reference to `libnet_do_checksum' 
mitmc.c:(.text+0x2a7): undefined reference to `libnet_geterror' 
/tmp/ccuzRcNp.o: In function `pkt_handler': 
mitmc.c:(.text+0x346): undefined reference to `libnet_write_raw_ipv4' 
mitmc.c:(.text+0x357): undefined reference to `libnet_geterror' 
/tmp/ccuzRcNp.o: In function `main': 
mitmc.c:(.text+0x466): undefined reference to `libnet_init' 
mitmc.c:(.text+0x4ae): undefined reference to `libnet_get_hwaddr' 
mitmc.c:(.text+0x4c6): undefined reference to `libnet_geterror' 
mitmc.c:(.text+0x590): undefined reference to `strlcat' 
mitmc.c:(.text+0x5c0): undefined reference to `strlcat' 
mitmc.c:(.text+0x5df): undefined reference to `pcap_lookupdev' 
mitmc.c:(.text+0x63c): undefined reference to `pcap_lookupnet' 
mitmc.c:(.text+0x697): undefined reference to `pcap_open_live' 
mitmc.c:(.text+0x6fc): undefined reference to `pcap_compile' 
mitmc.c:(.text+0x715): undefined reference to `pcap_perror' 
mitmc.c:(.text+0x736): undefined reference to `pcap_setfilter' 
mitmc.c:(.text+0x74f): undefined reference to `pcap_perror' 
mitmc.c:(.text+0x767): undefined reference to `pcap_freecode' 
mitmc.c:(.text+0x7ad): undefined reference to `pcap_loop' 
mitmc.c:(.text+0x7cd): undefined reference to `pcap_perror' 
mitmc.c:(.text+0x7e6): undefined reference to `pcap_close' 
mitmc.c:(.text+0x7f3): undefined reference to `libnet_destroy' 
collect2: ld returned 1 exit status 
: 나는 (이 features.h http://www.linuxquestions.org/questions/programming-9/tcp-hdr-variables-388003/에 설정되어 있기 때문에) #DEFINE의 _BSD_SOURCE 를 추가하여 정의 할 때, 그때 나는 오류의 완전히 다른 세트를 얻을 수 0

도움 주셔서 감사합니다.

플러스, BTW, 왜 내 컴파일러 오류 대신 따옴표의 때때로이 있습니까? bash에서 LANG = C를 사용하여 견적을 수정 해 주셔서 감사합니다. 여기 Repsonding

그래서 서식을 사용하여 응답합니다. 우수! 나는 libnet-config가 설정을 위해 명령 줄에서 사용할 수있는 바이너리라는 것을 전혀 몰랐습니다. 그래서 다른 noobs에 대한,

$ libnet-config --defines 
-D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H 
$ libnet-config --libs 
-lnet 

은 그래서 당신은 그래서 도움을

$ gcc -Wall `libnet-config --defines` mitmc.c -o mitmc `libnet-config --libs` -lpcap 
mitmc.c: In function 'main': 
mitmc.c:232: warning: implicit declaration of function 'strlcat' 
/tmp/ccSDMkcZ.o: In function `main': 
mitmc.c:(.text+0x590): undefined reference to `strlcat' 
mitmc.c:(.text+0x5c0): undefined reference to `strlcat' 
collect2: ld returned 1 exit status 

감사 명령으로 실행되는 탈출, 그게 정답입니다. 이제 코드는 openbsd 용으로 작성된 것으로 보입니다 (위키 백과 Strlcpy 참조). strcat을 strncpy로 바꾸고 최선을 다하겠습니다. 성공, 그것은 컴파일! 오 FFS,

$ sudo ./mitmc 
pcap_compile: syntax error 

아 내 사용법입니다.

당신에게 예레미야 감사합니다, 당신에게 블라드 감사합니다!

+1

인용 부호를 대체하는 이상한 문자는 로케일 설정 값입니다. 컴파일 할 때'LANG' 환경 변수를'C'로 설정하면 보통 따옴표를 얻게됩니다. –

답변

3

당신은 libnet를 사용하기 위해 컴파일러/링커에 특정 플래그를 지정해야합니다. 귀하의 경우 프로그램에서 사용중인 함수에 대한 정의를 찾을 수 없으므로 링커 오류가 표시됩니다. 분명히 이것은 libnetlibpcap과 연결해야하기 때문입니다. 올바른 결과를 얻으려면 다음과 같이 시도하십시오.

gcc -Wall `libnet-config --defines` mitmc.c -o mitmc `libnet-config --libs` -lpcap 
+0

내 무지 때문에 죄송합니다. 아마도 인형 FAQ를위한 컴파일이 있을까요? 나는 #include 문 때문에 이것을 얻기 위해 새로운 컴파일러를 생각했다. 와우, 다른 우둔한 사람을 위해, libnet-config는 실제로 출력물을 사용합니다. 당신은 .H 파일에 소스 코드를 #include를 컴파일러에게 있기 때문에 $ 4.0 하위 버전은 Libnet 파일 패치 - 설정 --defines -D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H – bearsinthesea

+0

이 컴파일러는 컴파일 시간 식별자를 알고있다. 링커에게는 아무 것도 말해주지 않습니다. 링커에게 별도로 알려야합니다.Visual Studio 및 다른 시스템에서도 똑같은 일이 발생합니다. –

관련 문제