Не можете скомпилировать простую программу с tcp.h из-за ошибки от endianess? - PullRequest
2 голосов
/ 28 февраля 2011

Помогите мне скомпилировать эту простую программу на C, используя tcp.h? Получение "mitmc.c: 82: ошибка: struct tcphdr не имеет члена с именем th_off", поскольку порядок байтов не установлен с "# ifdef __FAVOR_BSD"

Это простая проблема для некоторых из вас. Я пытаюсь скомпилировать эту программу, простой человек из средней утилиты из книги. Компиляция с gcc в linux (потому что в 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

Спасибо за любую помощь.

Плюс, кстати, почему мои ошибки компилятора иногда имеют вместо кавычек? Спасибо, с помощью LANG = C в bash исправлены кавычки.

Ответьте здесь, чтобы ответить, чтобы я мог использовать форматирование. Отлично! Я понятия не имел, что 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 (см. Википедию Strlcpy). Полагаю, я просто заменю strlcat на strncpy и надеюсь на лучшее. УСПЕХ, это скомпилировано! Ох ФФС,

$ sudo ./mitmc
pcap_compile: syntax error

Ах, это только мое использование.

Спасибо, Влад, спасибо, Иеремия!

1 Ответ

3 голосов
/ 28 февраля 2011

Чтобы использовать libnet, вы должны указать конкретные флаги вашему компилятору / компоновщику. В вашем случае вы видите ошибки компоновщика, потому что он не может найти определения для функций, которые вы используете в вашей программе. Очевидно, это потому, что вам нужно связать с libnet и libpcap. Чтобы сделать это правильно, попробуйте что-то вроде:

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