objdiff-core 2.3.3

A local diffing tool for decompilation projects.
Documentation
syntax = "proto3";

package objdiff.diff;

// A symbol
message Symbol {
  // Name of the symbol
  string name = 1;
  // Demangled name of the symbol
  optional string demangled_name = 2;
  // Symbol address
  uint64 address = 3;
  // Symbol size
  uint64 size = 4;
  // Bitmask of SymbolFlag
  uint32 flags = 5;
}

// Symbol visibility flags
enum SymbolFlag {
  SYMBOL_NONE = 0;
  SYMBOL_GLOBAL = 1;
  SYMBOL_LOCAL = 2;
  SYMBOL_WEAK = 3;
  SYMBOL_COMMON = 4;
  SYMBOL_HIDDEN = 5;
}

// A single parsed instruction
message Instruction {
  // Instruction address
  uint64 address = 1;
  // Instruction size
  uint32 size = 2;
  // Instruction opcode
  uint32 opcode = 3;
  // Instruction mnemonic
  string mnemonic = 4;
  // Instruction formatted string
  string formatted = 5;
  // Original (unsimplified) instruction string
  optional string original = 6;
  // Instruction arguments
  repeated Argument arguments = 7;
  // Instruction relocation
  optional Relocation relocation = 8;
  // Instruction branch destination
  optional uint64 branch_dest = 9;
  // Instruction line number
  optional uint32 line_number = 10;
}

// An instruction argument
message Argument {
  oneof value {
    // Plain text
    string plain_text = 1;
    // Value
    ArgumentValue argument = 2;
    // Relocation
    ArgumentRelocation relocation = 3;
    // Branch destination
    uint64 branch_dest = 4;
  }
}

// An instruction argument value
message ArgumentValue {
  oneof value {
    // Signed integer
    int64 signed = 1;
    // Unsigned integer
    uint64 unsigned = 2;
    // Opaque value
    string opaque = 3;
  }
}

// Marker type for relocation arguments
message ArgumentRelocation {
}

message Relocation {
  uint32 type = 1;
  string type_name = 2;
  RelocationTarget target = 3;
}

message RelocationTarget {
  Symbol symbol = 1;
  int64 addend = 2;
}

message InstructionDiff {
  DiffKind diff_kind = 1;
  optional Instruction instruction = 2;
  optional InstructionBranchFrom branch_from = 3;
  optional InstructionBranchTo branch_to = 4;
  repeated ArgumentDiff arg_diff = 5;
}

message ArgumentDiff {
  optional uint32 diff_index = 1;
}

enum DiffKind {
  DIFF_NONE = 0;
  DIFF_REPLACE = 1;
  DIFF_DELETE = 2;
  DIFF_INSERT = 3;
  DIFF_OP_MISMATCH = 4;
  DIFF_ARG_MISMATCH = 5;
}

message InstructionBranchFrom {
  repeated uint32 instruction_index = 1;
  uint32 branch_index = 2;
}

message InstructionBranchTo {
  uint32 instruction_index = 1;
  uint32 branch_index = 2;
}

message FunctionDiff {
  Symbol symbol = 1;
  repeated InstructionDiff instructions = 2;
  optional float match_percent = 3;
}

message DataDiff {
  DiffKind kind = 1;
  bytes data = 2;
  // May be larger than data
  uint64 size = 3;
}

message SectionDiff {
  string name = 1;
  SectionKind kind = 2;
  uint64 size = 3;
  uint64 address = 4;
  repeated FunctionDiff functions = 5;
  repeated DataDiff data = 6;
  optional float match_percent = 7;
}

enum SectionKind {
  SECTION_UNKNOWN = 0;
  SECTION_TEXT = 1;
  SECTION_DATA = 2;
  SECTION_BSS = 3;
  SECTION_COMMON = 4;
}

message ObjectDiff {
  repeated SectionDiff sections = 1;
}

message DiffResult {
  optional ObjectDiff left = 1;
  optional ObjectDiff right = 2;
}