LLVMツールを使用してバイナリデータを実行可能ファイルに含める

LLVMツールを使用してバイナリデータを実行可能ファイルに含める

以前は、.oまずGNUリンカを使用してリソースファイル(画像)をファイルに変換してプログラムに含めました。たとえば、

ld -r -b binary -o file.o file.svg

FreeBSD 12以降、デフォルトのリンカがGNUからLLVMに変更されました。リンカーがコマンドラインオプションを理解しているように見えますが、これによりエラーが発生します。たとえば、

ld -r -b binary -o file.o file.svg
ld: error: target emulation unknown: -m or at least one .o file required

また、コマンドラインオプションを試してみました。ld.lld(1)マニュアルページ:

ld --relocatable --format=binary -o file.o file.svg
ld: error: target emulation unknown: -m or at least one .o file required

私は正しいツールを使用していますか?-mこのオプションに値を指定する必要がありますか?

ベストアンサー1

追加する必要があるようです-z noexecstack(ELFバイナリにも追加されます)。LLD 7.0.0)。デフォルトでは、脆弱な実行可能なスタック領域があります。スタックメモリによる活用。あなたのバイナリイメージに実行可能なスタックがないので、これが失敗する理由だと思います。このエラーは、使用するターゲットモックターゲット(使用しないターゲット)をスタックに知らせる必要があるため、混乱します。

デビッド・ハーマンすべての努力をして、以下を含むクロスプラットフォームソリューションを見つけました。

  • GNU-ld
  • GNU - ゴールド
  • GNUライブラリツール
  • クロスコンパイルの使用
  • LLVMの使用
  • 外部の非標準ツールは必要ありません。

魔法の呼び出しは次のとおりです。

$(LD) -r -o "src/mydata.bin.o" -z noexecstack --format=binary "src/mydata.bin"

ほとんどの場合、このバイナリセグメントを読み取り専用に設定しようとします。

$(OBJCOPY) --rename-section .data=.rodata,alloc,load,readonly,data,contents "src/mydata.bin.o"

修正する:

私のシステムは次のようなのでテストできません。

$ uname -r
11.2-STABLE
$ ld -V
GNU ld 2.17.50 [FreeBSD] 2007-07-03
  Supported emulations:
   elf_x86_64_fbsd
   elf_i386_fbsd

これをテストするためにFreeBSD 12.0で仮想マシンを起動し、次のものを見つけました:

$ uname -r
12.0-RELEASE
$ ld -V
LLD 6.0.1 (FreeBSD 335540-1200005) (compatible with GNU linkers)

7.0.0にのみ追加され、-z noexecstackリストには表示されません。マニュアルページ6.0.1の場合。さらに迷惑なのは、サポートされていない値を指定しても-zエラーが発生しないことです!

これが動作するかどうかをテストするためにLLVM 7にアップグレードしませんでした。 @Richard Smithは-m他の答えにモックを付けて正しい解決策を直接見つけました。 LLDがサポートするエミュレーションをリストすると、-Vこのパスははるかに簡単になります。

fileこのコマンドを使用すると、file.oSYSV ELFによって識別されることがわかります。これで十分です。ただし、システムとまったく同じにするには、次のようにelf_amd64_fbsdします。ニックネームのためのelf_x86_64_fbsd。迷惑なことにld -V、GNU ldのようにサポートされているLLDエミュレーションを出力しません。

$ file /bin/cat
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 12.0 (1200086), FreeBSD-style, stripped
$ ld -r -b binary -m elf_amd64 -o data.o data.bin
$ file data.o
data.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ ld -r -b binary -m elf_amd64_fbsd -o data.o data.bin
$ file data.o
data.o: ELF 64-bit LSB relocatable, x86-64, version 1 (FreeBSD), not stripped

elf_amd64_fbsdはいelf_x86_64_fbsd(参照D7837そしてD24356)。 LLDが-V出力にエミュレーションを追加してください。

おすすめ記事