Simple data allocation strategy that expects the code to be in a writable
    segment. We just append the data to the end of the code.

def nasm_mutable_data_finalizer(env, code, data):
    """
    Simple data allocation strategy that expects the code to be in a writable
    segment. We just append the data to the end of the code.
    """

    if env.target.bits == 32:
        get_pc = [
            '\tcall __getpc0',
            '__getpc0:',
            '\tpop %s' % env.OFFSET_REG,
            '\tadd %s, __data - __getpc0' % env.OFFSET_REG,
            '__realstart:',
        ]
    else:
        get_pc = ['\tlea %s, [rel __data]' % env.OFFSET_REG]

    if data or env.buffers:
        return get_pc + code + _pack_data(data)
    else:
        return code