2011-02-28 100 views
2

帮我用tcp.h编译这个简单的C程序?因为字节顺序没有用“#ifdef __FAVOR_BSD”设置,所以得到“mitmc.c:82:error:struct tcphdr has no members named th_off”无法编译简单的程序与tcp.h由于从endianess错误?

对于你们中的一些人来说,这是一个简单的问题。我试图从一本书中编译this程序,一个简单的中间实用工具。在linux上用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只被定义如果 的#ifdef __FAVOR_BSD

但是,当我加入 的#define _BSD_SOURCE (因为它是在features.h http://www.linuxquestions.org/questions/programming-9/tcp-hdr-variables-388003/设置)定义它,然后我得到一个整体的其他一系列的错误:

$ 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 

感谢您的任何帮助。

再加上,顺便说一句,为什么我的编译器错误有时有â,而不是引号? 谢谢,在bash中使用LANG = C修正了引号。

在这里回答,以便我可以使用格式。 非常好!我不知道libnet-config是一个可以在命令行上用于设置的二进制文件。因此,对于其他菜鸟,

$ 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编写的(请参阅wikipedia Strlcpy)。我想我会用strncpy替换strlcat并希望最好。 SUCCESS,它编译!哦FFS,

​​

啊,这只是我的用法。

谢谢你弗拉德,谢谢你耶利米!

+1

替换引号的奇怪字符来自您的语言环境设置;如果在编译时将'LANG'环境变量设置为'C',则会得到正常的引号。 – 2011-02-28 00:24:02

回答

3

为了使用libnet,您必须为编译器/链接器指定特定的标志。在你的情况下,你会看到链接器错误,因为它找不到你在程序中使用的函数的定义。显然,这是因为您需要链接libnetlibpcap。为了解决问题,请尝试如下所示:

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

对不起,我的无知,也许有一个编译傻瓜常见问题?我认为编译器是新的,因为#include语句。哇,对于另一个无能为力的,libnet-config实际上会产生要使用的输出。 $ libnet-config --defines -D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H – bearsinthesea 2011-02-28 05:17:51

+0

编译器知道编译时标识符,因为你告诉编译器#include .h文件中的源代码。这并没有告诉链接器。你必须分别告诉链接器。Visual Studio和其他系统也会发生同样的情况。 – 2011-02-28 05:48:27

相关问题