【问题标题】:How to create raw binary from assembler "as" command如何从汇编程序“as”命令创建原始二进制文件
【发布时间】:2011-12-02 13:28:22
【问题描述】:

有没有办法从 max os x 中的“as”命令获取原始二进制输出? 当我组装一些简单的组装文件时,它会输出带有标题和一些符号信息的 Mach-O 目标文件。 我只想要文件的代码部分。

如果它没有任何有用的命令或命令选项,有没有简单的方法(命令)从 Mach-O 文件中提取指定段?

【问题讨论】:

    标签: macos assembly mach-o


    【解决方案1】:

    是的,您可以在组装和链接文件后使用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
    $
    

    【讨论】:

      【解决方案2】:

      不,as 汇编程序将源代码转换为目标文件,就像大多数(如果不是全部)汇编程序一样。然后您必须使用linker 来链接一个或多个object files,可以使用runtime libraries,以创建可执行文件。

      【讨论】:

        猜你喜欢
        • 2018-03-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        相关资源
        最近更新 更多