Как создать сырой двоичный файл из ассемблера "как" команда - PullRequest
1 голос
/ 02 декабря 2011

Есть ли способ получить необработанный двоичный вывод из команды "as" в max os x? Когда я собираю какой-нибудь простой файл сборки, он выводит объектный файл Mach-O с его заголовками и некоторой символьной информацией. Я хочу только часть кода файла.

Если у него нет никаких полезных команд или опций команд, есть ли какой-нибудь простой способ (команда) извлечь указанный сегмент из файла Mach-O?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Да, вы можете использовать otool после сборки и компоновки файла для извлечения кода.otool -t извлечет сегмент текста (кода) в шестнадцатеричном формате ASCII.Например:

$ cat hello.S
    .cstring
LC0:
    .ascii "Hello world!\12\0"
    .text
    .align 4,0x90
.globl _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $LC0, (%esp)
    call    _puts
    xorl    %eax, %eax
    leave
    ret
    .subsections_via_symbols
$ gcc -m32 hello.S -o hello
$ otool -t hello
hello:
(__TEXT,__text) section
00001f20 6a 00 89 e5 83 e4 f0 83 ec 10 8b 5d 04 89 1c 24 
00001f30 8d 4d 08 89 4c 24 04 83 c3 01 c1 e3 02 01 cb 89 
00001f40 5c 24 08 8b 03 83 c3 04 85 c0 75 f7 89 5c 24 0c 
00001f50 e8 0b 00 00 00 89 04 24 e8 19 00 00 00 f4 90 90 
00001f60 55 89 e5 83 ec 18 c7 04 24 a4 1f 00 00 e8 0a 00 
00001f70 00 00 31 c0 c9 c3 
$ 

Обратите внимание, что main фактически начинается с 00001f60:

$ otool -tv hello
hello:
(__TEXT,__text) section
start:
00001f20    pushl   $0x00
00001f22    movl    %esp,%ebp
00001f24    andl    $0xf0,%esp
00001f27    subl    $0x10,%esp
00001f2a    movl    0x04(%ebp),%ebx
00001f2d    movl    %ebx,(%esp)
00001f30    leal    0x08(%ebp),%ecx
00001f33    movl    %ecx,0x04(%esp)
00001f37    addl    $0x01,%ebx
00001f3a    shll    $0x02,%ebx
00001f3d    addl    %ecx,%ebx
00001f3f    movl    %ebx,0x08(%esp)
00001f43    movl    (%ebx),%eax
00001f45    addl    $0x04,%ebx
00001f48    testl   %eax,%eax
00001f4a    jne 0x00001f43
00001f4c    movl    %ebx,0x0c(%esp)
00001f50    calll   0x00001f60
00001f55    movl    %eax,(%esp)
00001f58    calll   0x00001f76
00001f5d    hlt
00001f5e    nop
00001f5f    nop
_main:
00001f60    pushl   %ebp
00001f61    movl    %esp,%ebp
00001f63    subl    $0x18,%esp
00001f66    movl    $0x00001fa4,(%esp)
00001f6d    calll   0x00001f7c
00001f72    xorl    %eax,%eax
00001f74    leave
00001f75    ret
$
0 голосов
/ 02 декабря 2011

Нет, as ассемблер переводит исходный код в объектные файлы, как это делает большинство, если не все, ассемблеры.Затем вам нужно использовать компоновщик , чтобы связать один или несколько объектных файлов , возможно с библиотеками времени выполнения , чтобы создать исполняемый файл.

...