📚

ゼロからのOS自作入門 5章 osbook_day05c の objcopy のオプションメモ

2021/05/05に公開

実行するコマンドはこちら。 p. 127

objcopy -I binary -O elf64-x86-64 -B i386:x86-64 hankaku.bin hankaku.o

意味は以下のとおり

-I bfdname
--input-target=bfdname
   Consider the source file's object format to be bfdname, rather than attempting to deduce it.

-O bfdname
--output-target=bfdname
   Write the output file using the object format bfdname.

-B bfdarch
--binary-architecture=bfdarch
   Useful when transforming a architecture-less input file into an object file.  In this case the output architecture can be set to bfdarch.
   This option will be ignored if the input file has a known bfdarch.  You can access this binary data inside a program by referencing the
   special symbols that are created by the conversion process.  These symbols are called _binary_objfile_start, _binary_objfile_end and
   _binary_objfile_size.  e.g. you can transform a picture file into an object file and then access it in your code using these symbols.

p. 126 の

_binary から始まる3つの変数はobjcopyコマンドにより決められた名前ですから、自由に命名することはできません。

は上記 -B のこの説明のこと。

These symbols are called _binary_objfile_start, _binary_objfile_end and _binary_objfile_size

bfdname とはなんぞや

GNU BFDライブラリ由来のもの BFDライブラリ - Wikipedia

objcopy は GNU binutils に含まれていて、 GNU binutils のいくつかのツールはこの BFD ライブラリというものを使うらしい。

指定できる bfdname は objdump の出力で確認できるらしい ( GNU Development toolkit )。

たとえばこう。適当に改行してます。 -O-I に指定するのはターゲット名。 -B に指定するのはアーキテクチャ名。

$ objdump --hep

略

objdump: サポートされているターゲット:
  elf64-x86-64       # -O elf64-x86-64 に指定している
  elf32-i386
  elf32-iamcu
  elf32-x86-64
  pei-i386
  pei-x86-64
  elf64-l1om
  elf64-k1om
  elf64-little
  elf64-big
  elf32-little
  elf32-big
  pe-x86-64
  pe-bigobj-x86-64
  pe-i386
  srec
  symbolsrec
  verilog
  tekhex
  binary            # -I binary に指定している
  ihex
  plugin

objdump: サポートされているアーキテクチャ:
  i386
  i386:x86-64       # -B i386:x86-64 に指定している
  i386:x64-32
  i8086
  i386:intel
  i386:x86-64:intel
  i386:x64-32:intel
  i386:nacl
  i386:x86-64:nacl
  i386:x64-32:nacl
  iamcu
  iamcu:intel
  l1om
  l1om:intel
  k1om
  k1om:intel

objdump -i にも現れる。

$ objdump -i
BFD ヘッダファイルバージョン (GNU Binutils for Ubuntu) 2.34
elf64-x86-64
 (header リトルエンディアン, data リトルエンディアン)
  i386

略

binary
 (header エンディアン不明, data エンディアン不明)
  i386
  l1om
  k1om
  iamcu

Discussion