я пытаюсь скомпилировать c программу на виртуальной машине с Ubuntu, и когда я запускаю gcc sniff.c -o sniff
(снифф. c - это имя моей программы), он показывает мне ошибку: asm/linkage.h: no such file or directory
. Меня гуглили и я знаю, что linkage.h является файлом, зависящим от архитектуры, но как мне узнать, какая арка моей ОС и как сказать компилятору найти нужный файл
Код моя программа:
#include <linux/ieee80211.h>
#include "/home/qin/iso15118/radiotap-library/radiotap.h"
#include "/home/qin/iso15118/radiotap-library/radiotap_iter.h"
#include <stdint.h>
#include <pcap.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <stddef.h>
#include <cstdint>
void my_callback(u_char *args, const struct pcap_pkthdr *pkthdr, const u_char *packet)
{
/*start with printing the type and payload*/
static int count = 1;
printf("packet%d | length: %d | ",count, pkthdr->caplen);
const struct ieee80211_radiotap_header *rt_hdr;
rt_hdr = (struct ieee80211_radiotap_header*)packet;
printf("version: 0x%x | pad: 0x%x | len: 0x%x | present: 0x%x\n", rt_hdr->it_version, rt_hdr->it_pad, rt_hdr->it_len, rt_hdr->it_present);
count++;
}
int main(int argc, char *argv[])
{
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *handle;
const u_char *packet;
struct pcap_pkthdr hdr; /*pcap.h*/
struct ether_header *eptr; /*net/ethernet.h*/
struct bpf_program fp;
char *filter_str;
bpf_u_int32 mask;
bpf_u_int32 net;
if(argc < 2) { fprintf(stdout, "Usage: %s <interface name> <optional: filter expression>\n", argv[0]); return 1; }
dev = argv[1];
/* ask pcap for the network address and mask of the device */
if (pcap_lookupnet(dev, &net, &mask, errbuf) != 0)
{
perror(errbuf);
exit(1);
}
/* create handle */
handle = pcap_create(dev, errbuf);
//const char *fname[256] = "/home/qin/iso15118/test0131.pcap";
//handle = pcap_fopen_offline(fname, errbuf);
if (handle == NULL)
{
printf("pcap_create: %s\n",errbuf);
exit(1);
}
/* activate the device, and print the warning or error message if there is any */
int act = pcap_activate(handle);
if (act > 0)
printf("pcap_activate warning: %s\n",pcap_statustostr(act));
else if (act < 0)
{
printf("pcap_activate error: %s\n", pcap_statustostr(act));
exit(1);
}
/* Compile and apply the filter */
if (argc == 3) {
filter_str = argv[2];
if (pcap_compile(handle, &fp, filter_str, 0, net) != 0)
{
fprintf(stderr, "Error compiling filter expression\n");
exit(1);
}
/* set the compiled program as the filter*/
if (pcap_setfilter(handle, &fp) != 0)
{
fprintf(stderr, "Error setting filter\n");
exit(1);
}
}
/* loop the capture and the callback*/
printf("Start capturing...\n");
pcap_loop(handle, 10, my_callback, NULL);
pcap_close(handle);
return(0);
}
Сообщение об ошибке:
In file included from /usr/src/linux-headers-5.3.0-28/include/linux/kernel.h:8:0,
from /usr/src/linux-headers-5.3.0-28/include/linux/skbuff.h:13,
from /usr/src/linux-headers-5.3.0-28/include/linux/if_ether.h:19,
from /usr/src/linux-headers-5.3.0-28/include/linux/ieee80211.h:19,
from sniff.c:2:
/usr/src/linux-headers-5.3.0-28/include/linux/linkage.h:8:10: fatal error: asm/linkage.h: No such file or directory
#include <asm/linkage.h>
^~~~~~~~~~~~~~~
compilation terminated.