序文
-
cmakeを使ってアプリケーションをクロスコンパイルする場合、[リンクスクリプト]を手動で設定しなくても正常にビルド生成できるようで、必要なアプリケーションがMakeで正常に生成できるようです。
-
ただし、一部のアプリケーションでは、リンク アドレスの変更など、[リンク スクリプト] を手動で指定する必要があります。
-
現在リンク スクリプトが設定されておらず、コンパイルされたアプリケーションのエントリ アドレスが 0 であることがわかります。
次のように:Entry point address: 0x0
readelf -h routingmanagerd
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: AArch64
Version: 0x1
Entry point address: 0x0
Start of program headers: 64 (bytes into file)
Start of section headers: 226912 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 8
Size of section headers: 64 (bytes)
Number of section headers: 38
Section header string table index: 37
cmake について学ぶ
-
デフォルトでは、cmake のビルド操作では Makefile のみが生成されるため、コンパイルとリンクを行うには make コマンドを実行する必要があります。
-
したがって、cmake ビルド ファイルに [リンク スクリプト] オプションを追加できます。
cmakeはリンクスクリプトのパスを設定します
- cmake は
set
コマンドで簡単に環境変数を設定できます。
set(LINK_SCRIPTS "-T/home/zhangsz/smart/adas/software/userapps/linker_scripts/aarch64/link.so.lds")
-
注: set を使用して cmake で環境変数を設定でき、環境変数名をカスタマイズできます。環境変数が存在する場合は、
${LINK_SCRIPTS}
設定された環境変数を取得するために使用できます。 -
ここでの操作は次のとおりです: 環境変数を
${LINK_SCRIPTS}
指定されたリンク スクリプトのパスに設定します。 -
-T/home/zhangsz/userapps/linker_scripts/aarch64/link.so.lds
ここで、-T
gcc コンパイル パラメータに使用されるリンク スクリプトを指定し、その後にリンク スクリプトのパスを指定することを意味します。
cmakeアプリケーションの生成
-
cmake は、デフォルトで次を使用してターゲット ファイルを生成します
target_link_libraries
。動的リンクは次のとおりです。 -
target_link_libraries(routingmanagerd ${VSOMEIP_NAME} ${Boost_LIBRARIES} ${DL_LIBRARY} ${DLT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${LINK_SCRIPTS})
リンクスクリプトに追加した[環境変数]は次のとおりです。${LINK_SCRIPTS}
- cmake は最終的に、これらの操作と環境変数を gcc またはクロスコンパイル gcc パラメーターに変換します。
コンパイル検証
- 詳細なログをコンパイルしたところ、リンク スクリプトが正常に設定されたことがわかりました。
-
cmake後、makeでコンパイルすると、コンパイルされたアプリケーションのリンクアドレスが、指定したリンクスクリプトのアドレスと一致し、指定したリンクスクリプトの動作設定が成功したことがわかります。
-
エントリ関数のアドレス
Entry point address: 0x201000
、リンク スクリプトで指定されたアドレス
readelf -h routingmanagerd
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: AArch64
Version: 0x1
Entry point address: 0x201000
Start of program headers: 64 (bytes into file)
Start of section headers: 232208 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 5
Size of section headers: 64 (bytes)
Number of section headers: 32
Section header string table index: 31
詳細なコンパイルプロセスを表示する方法
-
cmake 構成ファイルで設定します。
set(CMAKE_VERBOSE_MAKEFILE ON)
-
make V=1
または、VERBOSE=on
コンパイルをより詳細にすることもできます -
make をコンパイルするときに、シリアル ポートの出力をファイルにリダイレクトできるため、コンパイル情報ファイルを表示すると便利な場合があります。
make VERBOSE=on 2>&1 | tee output_log.txt
まとめ
-
普段はcmakeをあまり使わないので、手動でMakefileを書いてmakeでコンパイルすることが多いのですが、cmakeを使うと構築やコンパイルが楽になるはずです。
-
gcc のコンパイルパラメータに設定リンクスクリプトを追加するために使用される、cmake での [環境変数] の設定と読み取りの操作についての予備的な理解