GNU/Linux >> Belajar Linux >  >> Linux

Apakah ada cara untuk mendapatkan gcc untuk menghasilkan biner mentah?

Anda dapat menggunakan objcopy untuk menarik segmen teks dari file .o atau file 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    

Anda dapat meneruskan opsi ke linker secara langsung dengan -Wl,<linker option>

Dokumentasi yang relevan disalin di bawah dari man gcc

-Wl, opsi
Lewati opsi sebagai opsi ke linker. Jika opsi mengandung koma, itu dibagi menjadi beberapa opsi di koma. Anda dapat menggunakan sintaks ini untuk meneruskan argumen ke opsi. Misalnya, -Wl,-Map,output.map melewati -Map output.map ke linker. Saat menggunakan linker GNU, Anda juga bisa mendapatkan efek yang sama dengan-Wl,-Map=output.map.

Jadi saat mengkompilasi dengan gcc jika Anda meneruskan -Wl,--oformat=binary Anda akan menghasilkan file biner alih-alih format elf. Dimana --oformat=binary memberi tahu ld untuk menghasilkan file biner.

Ini menghilangkan kebutuhan untuk objcopy terpisah.

Perhatikan bahwa --oformat=binary dapat dinyatakan sebagai OUTPUT_FORMAT("binary") dari dalam skrip linker. Jika Anda ingin berurusan dengan biner datar, ada kemungkinan besar Anda akan mendapat manfaat dari kontrol tingkat tinggi yang disediakan oleh skrip penaut.


Coba ini:

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

Anda dapat memastikannya benar dengan 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  

Dan bandingkan dengan file biner:

$ 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. Apakah ada cara untuk mendengarkan proses?

  2. Apakah ada cara untuk mendapatkan versi BIOS dari dalam Linux?

  3. Apakah ada cara cepat untuk mendapatkan file terakhir dalam TAR besar?

  1. Apakah ada cara untuk 'uniq' dengan kolom?

  2. Apakah ada cara untuk mendapatkan UID pengguna di mesin Linux menggunakan java?

  3. Di bash, apakah ada cara untuk mengulang/mencetak stdout terakhir? Apakah ada variabel yang ditugaskan ke stdout?

  1. Apakah ada cara untuk mendapatkan time_t 64-bit dalam program 32-bit di Linux?

  2. Dapatkan baris pertama dari keluaran perintah shell

  3. bagaimana cara mendapatkan sha1sum untuk menghasilkan biner?