type
TElfMachineType = (emtnone, emtsparc, emti386, emtm68k, emtppc, emtppc64,
emtarm, emtarmeb, emtia64, emtx86_64, emtalpha,
- emtmips, emtmipsel, emtppc64le, emtaarch64);
+ emtmips, emtmipsel, emtppc64le, emtaarch64,
+ emtsparc64);
const
ELFMAGIC = chr($7f)+'ELF';
EM_PPC64 = 21;
EM_ARM = 40;
// EM_OLD_ALPHA = 41;
+ EM_SPARCV9 = 43; // Sparc 64-bit
EM_IA_64 = 50;
EM_MIPS_X = 51; // GNU readelf returns machine name "Stanford MIPS-X"
EM_X86_64 = 62;
R_AARCH64_ABS64 = 257;
R_68K_32 = 1;
R_SPARC_32 = 3;
+ R_SPARC_64 = 32;
R_ALPHA_REFQUAD = 2;
R_IA64_DIR64LSB = $27;
R_MIPS_32 = 2;
{$IFDEF CPUSPARC}
fMachineType:=emtsparc;
{$ENDIF}
+ {$IFDEF CPUSPARC64}
+ fMachineType:=emtsparc64;
+ {$ENDIF}
{$IFDEF CPUALPHA}
fMachineType:=emtalpha;
{$ENDIF}
end;
case subreader.MachineType of
EM_SPARC : fMachineType:=emtsparc;
+ EM_SPARCV9: fMachineType:=emtsparc64;
EM_386 : fMachineType:=emti386;
EM_68K : fMachineType:=emtm68k;
EM_PPC : fMachineType:=emtppc;
EM_AARCH64: begin RelocType:=R_AARCH64_ABS64; SectionType:=SHT_RELA; end;
EM_68K : begin RelocType:=R_68K_32; SectionType:=SHT_RELA; end;
EM_SPARC : begin RelocType:=R_SPARC_32; SectionType:=SHT_RELA; end;
+ EM_SPARCV9: begin RelocType:=R_SPARC_64; SectionType:=SHT_RELA; end;
EM_X86_64 : begin RelocType:=R_x86_64_64; SectionType:=SHT_RELA; end;
EM_PPC64 : begin RelocType:=R_PPC64_ADDR64; SectionType:=SHT_RELA; end;
EM_ALPHA : begin RelocType:=R_ALPHA_REFQUAD; SectionType:=SHT_RELA; end;
begin
case aMachineType of
emtsparc : begin fMachineTypeInt:=EM_SPARC; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
+ emtsparc64: begin fMachineTypeInt:=EM_SPARCV9; fBits:=ELFCLASS64; fOrder:=ELFDATA2MSB; end;
emti386 : begin fMachineTypeInt:=EM_386; fBits:=ELFCLASS32; fOrder:=ELFDATA2LSB; end;
emtm68k : begin fMachineTypeInt:=EM_68K; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
emtppc : begin fMachineTypeInt:=EM_PPC; fBits:=ELFCLASS32; fOrder:=ELFDATA2MSB; end;
writeln(' --arch, -a <name> Set object file architecture. Supported architectures:');
writeln(' i386, x86_64, arm (coff)');
writeln(' i386, x86_64, powerpc, powerpc64, arm, armeb, m68k,');
- writeln(' sparc, alpha, ia64, mips, mipsel (elf)');
+ writeln(' sparc, sparc64, alpha, ia64, mips, mipsel (elf)');
writeln(' i386, x86_64, powerpc, powerpc64, arm, aarch64 (mach-o)');
writeln(' bigendian, littleendian (external)');
writeln(' --subarch, -s <name> Set object file sub-architecture. Supported values:');
mtarmeb : Result.MachineType:=emtarmeb;
mtm68k : Result.MachineType:=emtm68k;
mtsparc : Result.MachineType:=emtsparc;
+ mtsparc64 : Result.MachineType:=emtsparc64;
mtalpha : Result.MachineType:=emtalpha;
mtia64 : Result.MachineType:=emtia64;
mtmips : Result.MachineType:=emtmips;
type
TMachineType = (mtnone, mti386,mtx86_64,mtppc,mtppc64,mtarm,mtarmeb,mtm68k,
mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
+ mtsparc64,
mtBigEndian,mtLittleEndian);
TMachineTypes = set of TMachineType;
(subarm: TSubMachineTypeArm);
mtnone, mti386,mtx86_64,mtppc,mtppc64,mtm68k,
mtsparc,mtalpha,mtia64,mtmips,mtmipsel,mtaarch64,mtppc64le,
+ mtsparc64,
mtBigEndian,mtLittleEndian:
(subgen: TSubMachineTypeGeneric);
end;
(name : 'mipsel'; formats : [ofElf]), //mtmipsel
(name : 'aarch64'; formats : [ofElf, ofCoff, ofMachO]), //mtaarch64
(name : 'powerpc64le'; formats : [ofElf]), //mtppc64le
+ (name : 'sparc64'; formats : [ofElf]), //mtsparc64
(name : 'bigendian'; formats : [ofExt]), //mtBigEndian
(name : 'littleendian'; formats : [ofExt]) //mtLittleEndian
);
mtppc64,mtarm,mtarmeb,
mtm68k,mtsparc,mtalpha,
mtia64,mtmips,mtmipsel,
- mtppc64le,mtaarch64]),
+ mtppc64le,mtaarch64,
+ mtsparc64]),
(name : 'coff'; ext : '.o'; machines : [mti386,mtx86_64,mtarm,
mtaarch64,mtppc,mtppc64]),
(name : 'xcoff'; ext : '.o'; machines : [mtppc{,mtppc64}]),
{$elseif defined(CPUSPARC)}
machine : mtsparc;
submachine : (subgen: smtgen_all);
+ {$elseif defined(CPUSPARC64)}
+ machine : mtsparc64;
+ submachine : (subgen: smtgen_all);
{$elseif defined(CPUALPHA)}
machine : mtalpha;
submachine : (subgen: smtgen_all);