0

ネットワークドライバモジュールによってエクスポートされたネットワークデバイスインターフェイスを使用したいと思います。これは私のプログラムdevget.cですユーザスペースへのネットワークデバイスインタフェースの "function"への未定義参照。 "

#include<stdio.h> 
#include<linux/netdevice.h> 

    void main(void) 
    { 
    struct net_device* device; 

    device = dev_get_by_name("eth0"); 
    if (device == NULL) 
     printf("device is NULL\n"); 
    else 
     printf("This is a success story\n"); 
    } 

私はこれをクロスコンパイルしています。 `dev_get_by_name 'への未定義参照。この関数は/linux/netdevice.hファイルのプロトタイプとして定義されています。これをagccでコンパイルして、スクリプトにインクルードパスを与えます。

+0

「dev_get_by_name」はカーネルに含まれていないようです。 – ciphor

+0

質問はネットワークデバイスインターフェイスを取得する方法です、私は自分のデバイス内のカーネルのネットワークAPIを呼び出すことができます。このdev_get_by_nameのプロトタイプを持つカーネルヘッダー/インラインファイルを与える必要があります。私はアンドロイドOSのためにこれをコンパイルしています。私はOSを持っているカーネルを含めて、agcc getdev.c -o getdev -I android/kernelのようなコンパイル時にカーネルにインクルードするパスを与えます。ユーザー空間からの – sraddhaj

+1

の場合、net_device構造体にアクセスすることはできません。ネットワークを構成するには、いくつかの標準インターフェースを使用する必要があります(ethtool、ifconfig)。それ以外の場合は、代わりにカーネルにコードを書く必要があります –

答えて

1

カーネルモジュールではなくユーザースペースプログラムを構築しているようです。

ユーザスペースプログラムはカーネル機能を使用できません。 libcや他のライブラリの関数しか使用できません。

コードをカーネルモジュールとしてコンパイルする必要があります。
main機能を持たず(同じではなくinit_module)、コンパイルプロセスが異なります(gcc -o myprog myprog.cだけではありません)。

カーネル開発に関する基本的な本を読むことをお勧めします。

関連する問題