前回、iwのビルドに挫折したので、リベンジする。

【関連記事】
【組込ボードで無線LAN】②(無線LANカードN-6300を組込ボードに接続するには?)
【組込ボードで無線LAN】⑧(iwのビルド:後編-1)【組込ボードで無線LAN】⑰(QCA9377-5を挿してみた)
  • 前回(iwのビルド失敗)の振り返り
前回、Ubuntu14(開発PC:x86_64)でまずiwのビルドを試みた。pkg-configにハマって抜け出せなくなったが、libnlをビルドして*.pcを生成すればいいのではないか?と考えた。

さらに、とりあえず組込Linuxボードでiwが動けばよいという話もある。深く考えずにYoctoの追加パッケージにiwを入れればよいのではないか?とも考えた。

次の項で色々試してみようと思う。ちなみに調べる過程で役に立ちそうなページを2つ見つけた。


ここにiwのクロスコンパイル方法が書いてある。しかし私のYocto(SDK)環境の/libにはpkgconfigがなかったので、もう1ひねり必要なのだろう。
iw

With the Netlink Protocol Library Suite prerequisite installed, download and build the iw nl80211 based CLI configuration utility:

wget https://www.kernel.org/pub/software/network/iw/iw-3.15.tar.gz
tar -xzf iw-3.15.tar.gz
cd iw-3.15/
export PKG_CONFIG_PATH=/usr/arm-linux-gnueabi/lib/pkgconfig
export CC=arm-linux-gnueabi-gcc
make
②iwlwifi Gentoo Wiki

iwlwifiを使う場合のカーネルコンフィグが書いてある。nl80211、cfg80211、mac80211などnetinkの基本ライブラリをインストールする方法、無線LANチップのファームウェアをインストール方法(ちょっと前にファームのダウンロードで失敗した。この記事があったらハマらなかったかも)など。
  • まずはlibnlをビルドしてみる。
①libnlのソースをダウンロードして解凍する(自分のアカウントのhome直下で実行してる)。
$ wget https://github.com/thom311/libnl/releases/download/libnl3_4_0/libnl-3.4.0.tar.gz
$ tar xvf libnl-3.4.0.tar.gz
②libnlのソースがあるディレクトリに移動して./configureを実行する。

$ cd libnl-3.4.0
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
config.status: executing libtool commands
-------------------------------------------------------------------------------
                                  NOTE

 There have been some changes starting with 3.2 regarding where and how libnl
 is being installed on the system in order to allow multiple libnl versions
 to be installed in parallel:

    - Headers will be installed in ${prefix}/include/libnl3, therefore
      you will need to add "-I/usr/include/libnl3" to CFLAGS

    - The library basename was renamed to libnl-3, i.e. the SO names become
      libnl-3.so., libnl-route-3.so, etc.

    - libtool versioning was assumed, to ease detection of compatible library
      versions.

 If you are using pkg-config for detecting and linking against the library
 things will continue magically as if nothing every happened. If you are
 linking manually you need to adapt your Makefiles or switch to using
 pkg-config files.

-------------------------------------------------------------------------------
③makeする。
$ make
  CC       lib/lib_libnl_3_la-addr.lo
  CC       lib/lib_libnl_3_la-attr.lo
  …
  CC       src/src_nl_util_addr-nl-util-addr.o
  CCLD     src/nl-util-addr
④管理者権限でmake installする。
$ sudo make install
make[1]: ディレクトリ `/home/pavement1234/libnl-3.4.0' に入ります
 /bin/mkdir -p '/usr/local/lib'
 /bin/bash ./libtool   --mode=install /usr/bin/install -c   lib/libnl-3.la lib/libnl-route-3.la lib/libnl-idiag-3.la lib/libnl-genl-3.la lib/libnl-nf-3.la lib/libnl-xfrm-3.la src/lib/libnl-cli-3.la '/usr/local/lib'
 ldconfig -n /usr/local/lib
…(省略)
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/usr/local/bin'
…(省略)
 ldconfig -n /usr/local/lib/libnl/cli/cls
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib/libnl/cli/cls

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/usr/local/lib/libnl/cli/qdisc'
…(省略)
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/local/lib/libnl/cli/qdisc
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib/libnl/cli/qdisc

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/usr/local/etc/libnl'
 /usr/bin/install -c -m 644 etc/pktloc etc/classid '/usr/local/etc/libnl'
make[1]: ディレクトリ `/home/pavement1234/libnl-3.4.0' から出ます
⑦インストール先を見てみる。

ビルドログを見ると、こんな感じのファイルがインストールされているようだ。pkgconfigも(/usr/local/lib/pkgconfig)にインストールされる。
/usr/local/bin/genl-ctrl-list
/usr/local/bin/idiag-socket-details
/usr/local/bin/nl-*
/usr/local/etc/libnl/classid
/usr/local/etc/libnl/pktloc
/usr/local/man/man8/*
/usr/local/share/man/man8/*
/usr/local/include/libnl3/netlink/*
/usr/local/lib/libnl
/usr/local/lib/libnl-*.a
/usr/local/lib/libnl-*.la
/usr/local/lib/libnl-*.so
/usr/local/lib/libnl-*.so.200
/usr/local/lib/pkgconfig


  • iwもビルドしてみる。
①PKG_CONFIG_PATHに/usr/local/lib/pkgconfig指定する。

$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
②iwをビルドする(成功)。
初めてiwのビルドが通りました。
$ cd ~/iw
$ make
 CC   ap.o
 CC   bitrate.o
bitrate.c: In function ‘handle_bitrates’:
…(省略)
In file included from wowlan.c:13:0:
nl80211.h:4886:8: note: ‘start’ declared here
  __u32 start, offset, len;
        ^
 GEN  version.c
 CC   version.o
 CC   iw
③ビルドしたiwを動かしてみる(成功)。
エラーなど出ずusageが出てきた。OKですね。
$ cd ~/iw
$ ./iw
./iw: /lib/x86_64-linux-gnu/libnl-genl-3.so.200: no version information available (required by ./iw)
./iw: /lib/x86_64-linux-gnu/libnl-3.so.200: no version information available (required by ./iw)
Usage:  ./iw [options] command
Options:
        --debug         enable netlink debugging
        --version       show version (5.3-3-g3708f61)
Commands:
        dev <devname> ap stop
        phy <phyname> wowlan enable [any] [disconnect] [magic-packet] [gtk-rekey-failure] [eap-identity-request] [4way-handshake] [rfkill-release] [net-detect [interval <in_msecs> | scan_plans [<interval_secs:iterations>*] <interval_secs>] [delay <in_secs>] [freqs <freq>+] [matches [ssid <ssid>]+]] [active [ssid <ssid>]+|passive] [randomise[=<addr>/<mask>]]] [tcp <config-file>] [patterns [offset1+]<pattern1> ...]

Commands that use the netdev ('dev') can also be given the
'wdev' instead to identify the device.

You can omit the 'phy' or 'dev' if the identification is unique,
e.g. "iw wlan0 info" or "iw phy0 info". (Don't when scripting.)

Do NOT screenscrape this tool, we don't consider its output stable.
④iwが参照するライブラリを見てみる。

自作libnl(/usr/local/lib/libnl-*.so.200)は参照されない。
$ ldd ~/iw/iw
./iw: /lib/x86_64-linux-gnu/libnl-genl-3.so.200: no version information available (required by ./iw)
./iw: /lib/x86_64-linux-gnu/libnl-3.so.200: no version information available (required by ./iw)
        linux-vdso.so.1 =>  (0x00007ffe6d9ac000)
        libnl-genl-3.so.200 => /lib/x86_64-linux-gnu/libnl-genl-3.so.200 (0x00007fa74ca86000)
        libnl-3.so.200 => /lib/x86_64-linux-gnu/libnl-3.so.200 (0x00007fa74c86b000)

        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa74c4a2000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa74c284000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa74bf7e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa74cc8c000)
自作libnl(/usr/local/lib/libnl-*.so.200)にライブラリ参照パスを通して、再びlddしてみると自作libnlが参照された。
$ LD_LIBRARY_PATH=/usr/local/lib
$ export LD_LIBRARY_PATH
$ ldd ~/iw/iw
        linux-vdso.so.1 =>  (0x00007fff51b6c000)
        libnl-genl-3.so.200 => /usr/local/lib/libnl-genl-3.so.200 (0x00007f334e35d000)
        libnl-3.so.200 => /usr/local/lib/libnl-3.so.200 (0x00007f334e13c000)

        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f334dd73000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f334db55000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f334e563000)



とりあえず、Ubuntu14(開発PC)でx86_64ビルドは出来たので、次はクロスコンパイル環境(Yocto)でiwをビルドしてみよう。

続く
IMG_20190930_082819

スポンサードリンク