def METHOD_NAME(
    self,
    full_binary: bytes,
    table_data: bytes,
    entry_len: int,
    string_offs_per_entry: List[int],
    write_subheader,
) -> bytes:
    table_data = bytearray(table_data)
    out_data = bytearray()
    pointer_offsets = []
    # 1. Write strings
    number_entries = 0
    for i in range(0, len(table_data), entry_len):
        for string_off in string_offs_per_entry:
            new_pointer = self._push_string(
                full_binary,
                out_data,
                u32_checked(
                    read_u32(table_data, i + string_off) - self._binary.loadaddress
                ),
            )
            pointer_offsets.append(u32(i + string_off))
            write_u32(table_data, new_pointer, i + string_off)
        number_entries += 1
    # Padding
    self._pad(out_data)
    # 2. Correct string pointer offsets
    pointer_offsets = [u32(off + len(out_data)) for off in pointer_offsets]
    # 3. Append table
    pointer_data_block = len(out_data)
    out_data += table_data
    # Padding
    self._pad(out_data)
    # 4. Write sub-header
    if write_subheader:
        data_pointer = len(out_data)
        pointer_offsets.append(u32(len(out_data)))
        out_data += pointer_data_block.to_bytes(4, byteorder="little", signed=False)
        out_data += number_entries.to_bytes(4, byteorder="little", signed=False)
    else:
        data_pointer = pointer_data_block
    # 5. Convert into SIR0
    return FileType.SIR0.serialize(
        FileType.SIR0.wrap(out_data, pointer_offsets, data_pointer)
    )