g cc ошибка: asm / linkage.h: нет такого файла или каталога - PullRequest
0 голосов
/ 03 февраля 2020

я пытаюсь скомпилировать 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.
...