次の makefile スニペットは、ファイルをファイルobjcopy
に変換するためのコマンド ライン オプションのようです。.so
.efi
OBJCOPYFLAGS = \
-j .text\
-j .sdata\
-j .data\
-j .dynamic\
-j .dynsym\
-j .rel\
-j .rela\
-j .reloc\
--target=efi-app-$(TARGET) <=====HERE
基本的に、.so
ファイルから特定のセクションをefi-app
ターゲットに抽出します。
しかしobjcopy --info
、サポートされているすべての出力ファイル形式 (以下を参照) を表示するために使用すると、efi-app
タイプがありません。
では、出力形式をobjcopy
サポートするにはどうすればよいでしょうか。efi-app
追加 1
関連リンクを見つけました: https://forums.gentoo.org/viewtopic-p-7197314.html
Gentoo Linux ディストリビューションとgnu-efiプロジェクトを検討する必要があるようです。
リンクが壊れている場合に備えて、以下の引用を追加してください。
質問:
UEFI アプリケーションの作成方法を学ぶことに興味がありました。gnu-efi ebuild をインストールしたところ、readme で objcopy が efi-app-x86_64 をサポートする必要があることがわかりました。objcopy --help を実行すると、efi-app-x86_64 について言及されていません。multitarget useflag を追加しようとしましたが、うまくいきませんでした。efiをサポートするツールチェーンを入手する方法を誰かが知っているか、またはgentoo / Linuxを使用してefiアプリを構築することに関するgoosdチュートリアルがあるかどうか疑問に思っていました.
答え:
まず、Gentoo の GNU-EFI はバージョン 3.0i で、これは非常に古いものです (2009 年 9 月)。現在のバージョンは 3.0 ですが、私のテストではうまく動作しません (バイナリの実行に失敗します)。バージョン 3.0r は私にとっては問題なく動作するので、Sourceforge ページからダウンロードしてローカルにインストールしてみてください。FWIW、私は今年の 4 月にバージョン バンプを要求するバグ レポートを提出しましたが、このバグ レポートにはローカルの ebuild へのリンクが含まれていますが、正式なアクションは得られませんでした。
あなたの主な質問に関しては、私の objcopy もターゲットとして efi-app-x86_64 を示していませんが、動作します。サポートされているターゲットに対して得られるものは次のとおりです。
コード:
objcopy: supported targets: elf64-x86-64 elf32-i386 elf32-x86-64 a.out-i386-linux pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex
GNU-EFI を使用して rEFInd をコンパイルすると、make の出力に (他の多くのメッセージの中でも) 次のメッセージが表示されます。
コード:
/usr/bin/objcopy -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \
-j .rela -j .reloc --target=efi-app-x86_64 refind_x64.so refind_x64.efi
これによりエラーは発生せず、実際、バイナリは正常に動作します。
つまり、問題が発生しない限り、心配する必要はありません。その場合は、詳細を投稿してください。
もう 1 点: GNU-EFI ではなく TianoCore EDK2 を使用して EFI アプリケーションをコンパイルすることが可能です。TianoCore は完全な EFI 実装であるため、EFI アプリケーションをコンパイルするだけではやり過ぎですが、十分に機能します。また、奇妙な (Linux 標準による) コンパイル プロセスもあり、Linux からインストールして使用するのは厄介です。新しい Shim セキュリティ ツールや gummiboot ブート ローダーなど、Linux ユーザー向けに開発されたほとんどの EFI プログラムは GNU-EFI を使用し、TianoCore ではコンパイルされません。OTOH、TianoCore は GNU-EFI よりもはるかに最新であり、TianoCore またはその前身の開発キット (EFI シェル プログラムなど) で開発されたものをコンパイルする場合に適しています。rEFInd などの一部のツールは、どちらの方法でもコンパイルできます。(rEFInd' ただし、BIOS/レガシー ブート ローダーを起動する機能は、TianoCore の機能に依存します。rEFInd を GNU-EFI でコンパイルすると、BIOS/レガシー ブート ローダーを起動できません。rEFInd の BUILDING.txt と Makefile を見て、より Linux/Unix に似た方法で TianoCore を使用する方法を学ぶことができます。最終的に、どのツールが最適かは、何をコンパイルするか (特定の既存のプログラムか、ゼロから作成する独自のプログラムか) によって異なります。新しいプログラムを作成している場合は、使用する EFI 機能を理解することが重要になる場合があります。どのツールが最適かは、何をコンパイルするか (特定の既存のプログラム、またはゼロから作成する独自のプログラム) によって異なります。新しいプログラムを作成している場合は、使用する EFI 機能を理解することが重要になる場合があります。どのツールが最適かは、何をコンパイルするか (特定の既存のプログラム、またはゼロから作成する独自のプログラム) によって異なります。新しいプログラムを作成している場合は、使用する EFI 機能を理解することが重要になる場合があります。