ここでは、簡単な説明の後に詳細を示します。ARM EABI 用に uClibc をクロスコンパイルしようとしています。独自のコンパイル済み Linux カーネルがあり、ヘッダー ファイルを抽出しました。フォルダに入れました。uClibc の「.config」ファイルでは、変数 KERNEL_HEADERS= を適切なフォルダーに設定しています。実際、コンパイル中に特定のポイントまでヘッダーが検出されます。これが見つかって途中で壊れる例を次に示します。
"libc/inet/if_index.c"
そのファイルは、次のように、各ファイルに一連のチェーン インクルードを生成します。
"libc/inet/netlinkaccess.h" (これは、次の Linux ヘッダーの #include を行います)
"kernel_hdr/linux/rtnetlink.h" (これは #include 次のもの)
"kernel_hdr/linux/netlink.h" (これは次の #include 用)
"kernel_hdr/linux/kernel.h" (これは #include を試行して失敗します)
これが#include <asm/types.h>
連鎖を断ち切ることです。#include <linux/xxx.h>
butではない最初のものです<asm/xxx.h>
。ファイル asm/types.h は存在しますが、見つかりません。警告もエラーもありません。それはただ言う
「エラー: 不明な型名 '__kernel_long_t'」
そのタイプは、壊れた一連のインクルードで定義されています。それが読み取れるかどうかを確認するために、いくつかの大きな構文エラーを入れました。いいえ!カーネルヘッダーのフォルダー構造認識の処理に問題があると思いました。カーネル ヘッダーを uClibc の通常のヘッダー (...uClibc/include/) とマージしようとしました。.config ファイルで KERNEL_HEADERS= (空またはフル パス) をどのように設定しても、まったく同じ動作が得られます。これを解決する方法がわかりません。
私のセットアップの詳細は次のとおりです。
ワークステーション: Ubuntu 16.04 LTS
uClibc は、3 日前にダウンロードされた GIT の最新バージョンです
ザイリンクス git からの Linux カーネル バージョン 4.9.0。(私は Zynq デュアル Cortex A9 で作業しています)
GCC ARM EABI はザイリンクス SDK 2017.1 から提供されます。
そのツールチェーンを使用して、カスタム FSBL (第 1 段階のブート ローダー)、カスタム Linux カーネル (u-boot をスキップし、FSBL はカーネルを直接ロードします)、デバイス ツリー、およびパッケージ全体を正常にコンパイルし、ハードウェア上で rootfs まで実行しました。 . 現在、カスタム rootfs を構築しています (busybox 成功、dropbear など)。唯一の失敗は、この uClibc がコンパイルできないことです。これは、ヘッダー ファイルが存在するにもかかわらず、一部のヘッダー ファイル内のインクルードが見つからないためです。
uClibc をビルドするには、uClibc フォルダーから使用します。
make menuconfig
make clean
make CROSS=arm-linux-gnueabi-
uClibc ビルドですべてのカーネル ヘッダー ファイルを検出するにはどうすればよいですか?