GNU/Linux >> Linux の 問題 >  >> Linux

生のバイナリを出力する gcc を取得する方法はありますか?

objcopy を使用できます .o ファイルまたは a.out ファイルからテキスト セグメントを引き出します。

$ cat q.c
f() {}
$ cc -S -O q.c
$ cat q.s
        .file   "q.c"
        .text
.globl f
        .type   f, @function
f:
        pushl   %ebp
        movl    %esp, %ebp
        popl    %ebp
        ret
        .size   f, .-f
        .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
        .section        .note.GNU-stack,"",@progbits
$ cc -c -O q.c
$ objcopy -O binary q.o q.bin
$ od -X q.bin
0000000 5de58955 000000c3
0000005
$ objdump -d q.o
q.o:     file format elf32-i386
Disassembly of section .text:
00000000 <f>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   5d                      pop    %ebp
   4:   c3                      ret    

-Wl,<linker option> でリンカーにオプションを直接渡すことができます

関連するドキュメントは、man gcc から以下にコピーされます

<ブロック引用>

-Wl,オプション
オプションをオプションとしてリンカーに渡します。オプションにコンマが含まれている場合、コンマで複数のオプションに分割されます。この構文を使用して、オプションに引数を渡すことができます。たとえば、-Wl,-Map,output.map は -Map output.map をリンカーに渡します。 GNU リンカーを使用する場合、-Wl,-Map=output.map を使用しても同じ効果が得られます。

-Wl,--oformat=binary を渡すと gcc でコンパイルするとき elf 形式の代わりにバイナリ ファイルを生成します。どこ --oformat=binary ld に伝えます バイナリ ファイルを生成します。

これにより、objcopy の必要がなくなります

--oformat=binary に注意してください OUTPUT_FORMAT("binary") と表現できます リンカー スクリプト内から。フラット バイナリを処理する場合は、リンカー スクリプトが提供する高レベルの制御から恩恵を受ける可能性が高くなります。


これを試してください:

$ gcc -c test.c     
$ objcopy -O binary -j .text test.o binfile

objdump で正しいことを確認できます :

$ objdump -d test.o 
test.o:     file format pe-i386


Disassembly of section .text:

00000000 <_f>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 04                sub    $0x4,%esp
   6:   8b 45 08                mov    0x8(%ebp),%eax
   9:   0f af 45 08             imul   0x8(%ebp),%eax
   d:   89 45 fc                mov    %eax,-0x4(%ebp)
  10:   8b 45 fc                mov    -0x4(%ebp),%eax
  13:   83 c0 02                add    $0x2,%eax
  16:   c9                      leave  
  17:   c3                      ret  

そしてそれをバイナリファイルと比較してください:

$ hexdump -C binfile 
00000000  55 89 e5 83 ec 04 8b 45  08 0f af 45 08 89 45 fc  |U......E...E..E.|
00000010  8b 45 fc 83 c0 02 c9 c3                           |.E......|
00000018

Linux
  1. Linux – Elfバイナリからコンパイラ情報を取得できますか?

  2. インストールされた RPM の署名キー ID をプログラムで取得する方法はありますか?

  3. javaを使用してLinuxマシンでユーザーのUIDを取得する方法はありますか?

  1. bash で、最後の stdout をエコー/印刷する方法はありますか? stdout が割り当てられる変数はありますか?

  2. シェル コマンドの出力の最初の行を取得する

  3. 不良ブロックを再起動する方法はありますか?

  1. tcpdump:grep可能な出力を取得するには?

  2. プロセスを聞く方法はありますか?

  3. Linux 内から BIOS バージョンを取得する方法はありますか?