Index: courgette/assembly_program.cc |
diff --git a/courgette/assembly_program.cc b/courgette/assembly_program.cc |
index f759e16a90668538dd7134ac62acddb9e2a74a74..9225578488791391e92a961941c9a0661d5ba749 100644 |
--- a/courgette/assembly_program.cc |
+++ b/courgette/assembly_program.cc |
@@ -22,7 +22,8 @@ namespace courgette { |
// Opcodes of simple assembly language |
enum OP { |
ORIGIN, // ORIGIN <rva> - set current address for assembly. |
- MAKERELOCS, // Generates a base relocation table. |
+ MAKEPERELOCS, // Generates a base relocation table. |
+ MAKEELFRELOCS, // Generates a base relocation table. |
DEFBYTE, // DEFBYTE <value> - emit a byte literal. |
REL32, // REL32 <label> - emit a rel32 encoded reference to 'label'. |
ABS32, // REL32 <label> - emit am abs32 encoded reference to 'label'. |
@@ -58,10 +59,16 @@ class OriginInstruction : public Instruction { |
RVA rva_; |
}; |
-// Emits an entire base relocation table. |
-class MakeRelocsInstruction : public Instruction { |
+// Emits an entire PE base relocation table. |
+class PeRelocsInstruction : public Instruction { |
public: |
- MakeRelocsInstruction() : Instruction(MAKERELOCS) {} |
+ PeRelocsInstruction() : Instruction(MAKEPERELOCS) {} |
+}; |
+ |
+// Emits an ELF relocation table. |
+class ElfRelocsInstruction : public Instruction { |
+ public: |
+ ElfRelocsInstruction() : Instruction(MAKEELFRELOCS) {} |
}; |
// Emits a single byte. |
@@ -108,8 +115,12 @@ AssemblyProgram::~AssemblyProgram() { |
DeleteContainedLabels(abs32_labels_); |
} |
-CheckBool AssemblyProgram::EmitMakeRelocsInstruction() { |
- return Emit(new(std::nothrow) MakeRelocsInstruction()); |
+CheckBool AssemblyProgram::EmitPeRelocsInstruction() { |
+ return Emit(new(std::nothrow) PeRelocsInstruction()); |
+} |
+ |
+CheckBool AssemblyProgram::EmitElfRelocationInstruction() { |
+ return Emit(new(std::nothrow) ElfRelocsInstruction()); |
} |
CheckBool AssemblyProgram::EmitOriginInstruction(RVA rva) { |
@@ -357,8 +368,13 @@ EncodedProgram* AssemblyProgram::Encode() const { |
return NULL; |
break; |
} |
- case MAKERELOCS: { |
- if (!encoded->AddMakeRelocs()) |
+ case MAKEPERELOCS: { |
+ if (!encoded->AddPeMakeRelocs()) |
+ return NULL; |
+ break; |
+ } |
+ case MAKEELFRELOCS: { |
+ if (!encoded->AddElfMakeRelocs()) |
return NULL; |
break; |
} |