yaml2obj

yaml2obj takes a YAML description of an object file and converts it to a binary file.

$ yaml2obj input-file

Outputs the binary to stdout.

COFF Syntax

Here’s a sample COFF file.

header:
  Machine: IMAGE_FILE_MACHINE_I386 # (0x14C)

sections:
  - Name: .text
    Characteristics: [ IMAGE_SCN_CNT_CODE
                     , IMAGE_SCN_ALIGN_16BYTES
                     , IMAGE_SCN_MEM_EXECUTE
                     , IMAGE_SCN_MEM_READ
                     ] # 0x60500020
    SectionData:
      "\x83\xEC\x0C\xC7\x44\x24\x08\x00\x00\x00\x00\xC7\x04\x24\x00\x00\x00\x00\xE8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8B\x44\x24\x08\x83\xC4\x0C\xC3" # |....D$.......$...............D$.....|

symbols:
  - Name: .text
    Value: 0
    SectionNumber: 1
    SimpleType: IMAGE_SYM_TYPE_NULL # (0)
    ComplexType: IMAGE_SYM_DTYPE_NULL # (0)
    StorageClass: IMAGE_SYM_CLASS_STATIC # (3)
    NumberOfAuxSymbols: 1
    AuxiliaryData:
      "\x24\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00" # |$.................|

  - Name: _main
    Value: 0
    SectionNumber: 1
    SimpleType: IMAGE_SYM_TYPE_NULL # (0)
    ComplexType: IMAGE_SYM_DTYPE_NULL # (0)
    StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)

Here’s a simplified Kwalify schema with an extension to allow alternate types.

type: map
  mapping:
    header:
      type: map
      mapping:
        Machine: [ {type: str, enum:
                               [ IMAGE_FILE_MACHINE_UNKNOWN
                               , IMAGE_FILE_MACHINE_AM33
                               , IMAGE_FILE_MACHINE_AMD64
                               , IMAGE_FILE_MACHINE_ARM
                               , IMAGE_FILE_MACHINE_ARMV7
                               , IMAGE_FILE_MACHINE_EBC
                               , IMAGE_FILE_MACHINE_I386
                               , IMAGE_FILE_MACHINE_IA64
                               , IMAGE_FILE_MACHINE_M32R
                               , IMAGE_FILE_MACHINE_MIPS16
                               , IMAGE_FILE_MACHINE_MIPSFPU
                               , IMAGE_FILE_MACHINE_MIPSFPU16
                               , IMAGE_FILE_MACHINE_POWERPC
                               , IMAGE_FILE_MACHINE_POWERPCFP
                               , IMAGE_FILE_MACHINE_R4000
                               , IMAGE_FILE_MACHINE_SH3
                               , IMAGE_FILE_MACHINE_SH3DSP
                               , IMAGE_FILE_MACHINE_SH4
                               , IMAGE_FILE_MACHINE_SH5
                               , IMAGE_FILE_MACHINE_THUMB
                               , IMAGE_FILE_MACHINE_WCEMIPSV2
                               ]}
                 , {type: int}
                 ]
        Characteristics:
          - type: seq
            sequence:
              - type: str
                enum: [ IMAGE_FILE_RELOCS_STRIPPED
                      , IMAGE_FILE_EXECUTABLE_IMAGE
                      , IMAGE_FILE_LINE_NUMS_STRIPPED
                      , IMAGE_FILE_LOCAL_SYMS_STRIPPED
                      , IMAGE_FILE_AGGRESSIVE_WS_TRIM
                      , IMAGE_FILE_LARGE_ADDRESS_AWARE
                      , IMAGE_FILE_BYTES_REVERSED_LO
                      , IMAGE_FILE_32BIT_MACHINE
                      , IMAGE_FILE_DEBUG_STRIPPED
                      , IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
                      , IMAGE_FILE_NET_RUN_FROM_SWAP
                      , IMAGE_FILE_SYSTEM
                      , IMAGE_FILE_DLL
                      , IMAGE_FILE_UP_SYSTEM_ONLY
                      , IMAGE_FILE_BYTES_REVERSED_HI
                      ]
          - type: int
    sections:
      type: seq
      sequence:
        - type: map
          mapping:
            Name: {type: str}
            Characteristics:
              - type: seq
                sequence:
                  - type: str
                    enum: [ IMAGE_SCN_TYPE_NO_PAD
                          , IMAGE_SCN_CNT_CODE
                          , IMAGE_SCN_CNT_INITIALIZED_DATA
                          , IMAGE_SCN_CNT_UNINITIALIZED_DATA
                          , IMAGE_SCN_LNK_OTHER
                          , IMAGE_SCN_LNK_INFO
                          , IMAGE_SCN_LNK_REMOVE
                          , IMAGE_SCN_LNK_COMDAT
                          , IMAGE_SCN_GPREL
                          , IMAGE_SCN_MEM_PURGEABLE
                          , IMAGE_SCN_MEM_16BIT
                          , IMAGE_SCN_MEM_LOCKED
                          , IMAGE_SCN_MEM_PRELOAD
                          , IMAGE_SCN_ALIGN_1BYTES
                          , IMAGE_SCN_ALIGN_2BYTES
                          , IMAGE_SCN_ALIGN_4BYTES
                          , IMAGE_SCN_ALIGN_8BYTES
                          , IMAGE_SCN_ALIGN_16BYTES
                          , IMAGE_SCN_ALIGN_32BYTES
                          , IMAGE_SCN_ALIGN_64BYTES
                          , IMAGE_SCN_ALIGN_128BYTES
                          , IMAGE_SCN_ALIGN_256BYTES
                          , IMAGE_SCN_ALIGN_512BYTES
                          , IMAGE_SCN_ALIGN_1024BYTES
                          , IMAGE_SCN_ALIGN_2048BYTES
                          , IMAGE_SCN_ALIGN_4096BYTES
                          , IMAGE_SCN_ALIGN_8192BYTES
                          , IMAGE_SCN_LNK_NRELOC_OVFL
                          , IMAGE_SCN_MEM_DISCARDABLE
                          , IMAGE_SCN_MEM_NOT_CACHED
                          , IMAGE_SCN_MEM_NOT_PAGED
                          , IMAGE_SCN_MEM_SHARED
                          , IMAGE_SCN_MEM_EXECUTE
                          , IMAGE_SCN_MEM_READ
                          , IMAGE_SCN_MEM_WRITE
                          ]
              - type: int
            SectionData: {type: str}
    symbols:
      type: seq
      sequence:
        - type: map
          mapping:
            Name: {type: str}
            Value: {type: int}
            SectionNumber: {type: int}
            SimpleType: [ {type: str, enum: [ IMAGE_SYM_TYPE_NULL
                                            , IMAGE_SYM_TYPE_VOID
                                            , IMAGE_SYM_TYPE_CHAR
                                            , IMAGE_SYM_TYPE_SHORT
                                            , IMAGE_SYM_TYPE_INT
                                            , IMAGE_SYM_TYPE_LONG
                                            , IMAGE_SYM_TYPE_FLOAT
                                            , IMAGE_SYM_TYPE_DOUBLE
                                            , IMAGE_SYM_TYPE_STRUCT
                                            , IMAGE_SYM_TYPE_UNION
                                            , IMAGE_SYM_TYPE_ENUM
                                            , IMAGE_SYM_TYPE_MOE
                                            , IMAGE_SYM_TYPE_BYTE
                                            , IMAGE_SYM_TYPE_WORD
                                            , IMAGE_SYM_TYPE_UINT
                                            , IMAGE_SYM_TYPE_DWORD
                                            ]}
                        , {type: int}
                        ]
            ComplexType: [ {type: str, enum: [ IMAGE_SYM_DTYPE_NULL
                                             , IMAGE_SYM_DTYPE_POINTER
                                             , IMAGE_SYM_DTYPE_FUNCTION
                                             , IMAGE_SYM_DTYPE_ARRAY
                                             ]}
                         , {type: int}
                         ]
            StorageClass: [ {type: str, enum:
                                        [ IMAGE_SYM_CLASS_END_OF_FUNCTION
                                        , IMAGE_SYM_CLASS_NULL
                                        , IMAGE_SYM_CLASS_AUTOMATIC
                                        , IMAGE_SYM_CLASS_EXTERNAL
                                        , IMAGE_SYM_CLASS_STATIC
                                        , IMAGE_SYM_CLASS_REGISTER
                                        , IMAGE_SYM_CLASS_EXTERNAL_DEF
                                        , IMAGE_SYM_CLASS_LABEL
                                        , IMAGE_SYM_CLASS_UNDEFINED_LABEL
                                        , IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
                                        , IMAGE_SYM_CLASS_ARGUMENT
                                        , IMAGE_SYM_CLASS_STRUCT_TAG
                                        , IMAGE_SYM_CLASS_MEMBER_OF_UNION
                                        , IMAGE_SYM_CLASS_UNION_TAG
                                        , IMAGE_SYM_CLASS_TYPE_DEFINITION
                                        , IMAGE_SYM_CLASS_UNDEFINED_STATIC
                                        , IMAGE_SYM_CLASS_ENUM_TAG
                                        , IMAGE_SYM_CLASS_MEMBER_OF_ENUM
                                        , IMAGE_SYM_CLASS_REGISTER_PARAM
                                        , IMAGE_SYM_CLASS_BIT_FIELD
                                        , IMAGE_SYM_CLASS_BLOCK
                                        , IMAGE_SYM_CLASS_FUNCTION
                                        , IMAGE_SYM_CLASS_END_OF_STRUCT
                                        , IMAGE_SYM_CLASS_FILE
                                        , IMAGE_SYM_CLASS_SECTION
                                        , IMAGE_SYM_CLASS_WEAK_EXTERNAL
                                        , IMAGE_SYM_CLASS_CLR_TOKEN
                                        ]}
                          , {type: int}
                          ]