mirror of
https://github.com/claunia/libexeinfo.git
synced 2025-12-16 19:14:24 +00:00
Add ELF detection if Dell System V, UnixWare, PowerPC OS/2, NonStop Kernel for MIPS, Solaris/ppc and Amiga UNIX.
This commit is contained in:
@@ -239,7 +239,8 @@ namespace libexeinfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(RequiredOperatingSystem.Name == null)
|
if(RequiredOperatingSystem.Name == null)
|
||||||
RequiredOperatingSystem = GetOsByInterpreter(interpreter, false, false);
|
RequiredOperatingSystem =
|
||||||
|
GetOsByInterpreter(interpreter, false, false, false, false, false, Header.e_machine);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -369,11 +370,18 @@ namespace libexeinfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
notes = new Dictionary<string, ElfNote>();
|
notes = new Dictionary<string, ElfNote>();
|
||||||
bool beos = false;
|
bool beos = false;
|
||||||
bool haiku = false;
|
bool haiku = false;
|
||||||
bool solaris = false;
|
bool solaris = false;
|
||||||
bool lynxos = false;
|
bool lynxos = false;
|
||||||
bool skyos = false;
|
bool skyos = false;
|
||||||
|
bool dellsysv = false;
|
||||||
|
bool unixware = false;
|
||||||
|
bool os2 = false;
|
||||||
|
bool amigaos4 = false;
|
||||||
|
bool aros = false;
|
||||||
|
bool morphos = false;
|
||||||
|
bool nonstop = (uint)Header.e_type == 100;
|
||||||
|
|
||||||
// Sections that contain an array of null-terminated strings by definition
|
// Sections that contain an array of null-terminated strings by definition
|
||||||
for(int i = 0; i < sections.Length; i++)
|
for(int i = 0; i < sections.Length; i++)
|
||||||
@@ -406,13 +414,24 @@ namespace libexeinfo
|
|||||||
interpreter = str;
|
interpreter = str;
|
||||||
break;
|
break;
|
||||||
case ".comment":
|
case ".comment":
|
||||||
if(str.Contains("beos")) beos = true;
|
if(str.Contains("beos")) beos = true;
|
||||||
if(str.Contains("haiku")) haiku = true;
|
if(str.Contains("haiku")) haiku = true;
|
||||||
if(str.Contains("(Lynx)")) lynxos = true;
|
if(str.Contains("(Lynx)")) lynxos = true;
|
||||||
|
if(str.StartsWith("Dell UNIX System V")) dellsysv = true;
|
||||||
|
if(str.Contains("uw7") || str.Contains("uw1")) unixware = true;
|
||||||
break;
|
break;
|
||||||
case ".dynstr":
|
case ".dynstr":
|
||||||
if(str.StartsWith("SUNW")) solaris = true;
|
if(str.Contains("SUNW")) solaris = true;
|
||||||
if(str == "libsky.so") skyos = true;
|
switch(str)
|
||||||
|
{
|
||||||
|
case "libsky.so":
|
||||||
|
skyos = true;
|
||||||
|
break;
|
||||||
|
case "DOSCALLS":
|
||||||
|
os2 = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -482,6 +501,25 @@ namespace libexeinfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < sections.Length; i++)
|
||||||
|
{
|
||||||
|
if(sectionNames[i] != ".rodata") continue;
|
||||||
|
|
||||||
|
buffer = new byte[sections[i].sh_size];
|
||||||
|
BaseStream.Position = (long)sections[i].sh_offset;
|
||||||
|
BaseStream.Read(buffer, 0, buffer.Length);
|
||||||
|
string rodataAsString = Encoding.ASCII.GetString(buffer);
|
||||||
|
|
||||||
|
if(Header.e_machine == eMachine.EM_PPC)
|
||||||
|
{
|
||||||
|
if(rodataAsString.Contains("SUNW_OST_OSLIB")) solaris = true;
|
||||||
|
else if(rodataAsString.Contains("newlib.library")) amigaos4 = true;
|
||||||
|
else if(rodataAsString.Contains("arosc.library")) aros = true;
|
||||||
|
else if(rodataAsString.Contains("intuition.library")) morphos = true;
|
||||||
|
}
|
||||||
|
else if(rodataAsString.Contains("arosc.library")) aros = true;
|
||||||
|
}
|
||||||
|
|
||||||
if(notes.TryGetValue(".note.ABI-tag", out ElfNote abiTag))
|
if(notes.TryGetValue(".note.ABI-tag", out ElfNote abiTag))
|
||||||
RequiredOperatingSystem = GetOsByNote(abiTag, interpreter, IsBigEndian);
|
RequiredOperatingSystem = GetOsByNote(abiTag, interpreter, IsBigEndian);
|
||||||
else if(notes.TryGetValue(".note.netbsd.ident", out ElfNote netbsdIdent))
|
else if(notes.TryGetValue(".note.netbsd.ident", out ElfNote netbsdIdent))
|
||||||
@@ -546,35 +584,17 @@ namespace libexeinfo
|
|||||||
case eiOsabi.ELFOSABI_STANDALONE:
|
case eiOsabi.ELFOSABI_STANDALONE:
|
||||||
RequiredOperatingSystem = new OperatingSystem {Name = "None"};
|
RequiredOperatingSystem = new OperatingSystem {Name = "None"};
|
||||||
break;
|
break;
|
||||||
default: throw new ArgumentOutOfRangeException();
|
|
||||||
}
|
}
|
||||||
else if(!string.IsNullOrEmpty(interpreter))
|
else if(!string.IsNullOrEmpty(interpreter))
|
||||||
RequiredOperatingSystem = GetOsByInterpreter(interpreter, skyos, solaris);
|
RequiredOperatingSystem =
|
||||||
else if(beos) RequiredOperatingSystem = new OperatingSystem {Name = "BeOS", MajorVersion = 4};
|
GetOsByInterpreter(interpreter, skyos, solaris, dellsysv, unixware, os2, Header.e_machine);
|
||||||
else if(haiku) RequiredOperatingSystem = new OperatingSystem {Name = "Haiku"};
|
else if(beos) RequiredOperatingSystem = new OperatingSystem {Name = "BeOS", MajorVersion = 4};
|
||||||
else if(lynxos) RequiredOperatingSystem = new OperatingSystem {Name = "LynxOS"};
|
else if(haiku) RequiredOperatingSystem = new OperatingSystem {Name = "Haiku"};
|
||||||
else
|
else if(lynxos) RequiredOperatingSystem = new OperatingSystem {Name = "LynxOS"};
|
||||||
for(int i = 0; i < sections.Length; i++)
|
else if(amigaos4) RequiredOperatingSystem = new OperatingSystem {Name = "AmigaOS", MajorVersion = 4};
|
||||||
{
|
else if(aros) RequiredOperatingSystem = new OperatingSystem {Name = "AROS"};
|
||||||
if(sectionNames[i] != ".rodata") continue;
|
else if(morphos) RequiredOperatingSystem = new OperatingSystem {Name = "MorphOS"};
|
||||||
|
else if(nonstop) RequiredOperatingSystem = new OperatingSystem {Name = "Non-Stop Kernel"};
|
||||||
buffer = new byte[sections[i].sh_size];
|
|
||||||
BaseStream.Position = (long)sections[i].sh_offset;
|
|
||||||
BaseStream.Read(buffer, 0, buffer.Length);
|
|
||||||
string rodataAsString = Encoding.ASCII.GetString(buffer);
|
|
||||||
|
|
||||||
if(Header.e_machine == eMachine.EM_PPC)
|
|
||||||
{
|
|
||||||
if(rodataAsString.Contains("newlib.library"))
|
|
||||||
RequiredOperatingSystem = new OperatingSystem {Name = "AmigaOS", MajorVersion = 4};
|
|
||||||
else if(rodataAsString.Contains("arosc.library"))
|
|
||||||
RequiredOperatingSystem = new OperatingSystem {Name = "AROS"};
|
|
||||||
else if(rodataAsString.Contains("intuition.library"))
|
|
||||||
RequiredOperatingSystem = new OperatingSystem {Name = "MorphOS"};
|
|
||||||
}
|
|
||||||
else if(rodataAsString.Contains("arosc.library"))
|
|
||||||
RequiredOperatingSystem = new OperatingSystem {Name = "AROS"};
|
|
||||||
}
|
|
||||||
|
|
||||||
if(strings.Count > 0)
|
if(strings.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -696,30 +716,30 @@ namespace libexeinfo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static OperatingSystem GetOsByInterpreter(string interpreter, bool skyos, bool solaris)
|
static OperatingSystem GetOsByInterpreter(string interpreter, bool skyos, bool solaris, bool dellsysv,
|
||||||
|
bool unixware, bool os2, eMachine machine)
|
||||||
{
|
{
|
||||||
switch(interpreter)
|
switch(interpreter)
|
||||||
{
|
{
|
||||||
case "/usr/lib/ldqnx.so.2":
|
case "/usr/lib/ldqnx.so.2": return new OperatingSystem {Name = "QNX", MajorVersion = 6};
|
||||||
return new OperatingSystem {Name = "QNX", MajorVersion = 6};
|
|
||||||
|
|
||||||
break;
|
case "/usr/dglib/libc.so.1": return new OperatingSystem {Name = "DG/UX"};
|
||||||
case "/usr/dglib/libc.so.1":
|
|
||||||
return new OperatingSystem {Name = "DG/UX"};
|
|
||||||
|
|
||||||
break;
|
case "/shlib/ld-bsdi.so": return new OperatingSystem {Name = "BSD/OS"};
|
||||||
case "/shlib/ld-bsdi.so":
|
|
||||||
return new OperatingSystem {Name = "BSD/OS"};
|
|
||||||
|
|
||||||
break;
|
case "/usr/lib/libc.so.1" when skyos: return new OperatingSystem {Name = "SkyOS"};
|
||||||
case "/usr/lib/libc.so.1" when skyos:
|
|
||||||
return new OperatingSystem {Name = "SkyOS"};
|
|
||||||
|
|
||||||
break;
|
|
||||||
case "/usr/lib/ld.so.1" when solaris:
|
case "/usr/lib/ld.so.1" when solaris:
|
||||||
return new OperatingSystem {Name = "Solaris"};
|
case "/usr/lib/amd64/ld.so.1" when solaris: return new OperatingSystem {Name = "Solaris"};
|
||||||
|
|
||||||
break;
|
case "/usr/lib/libc.so.1" when unixware: return new OperatingSystem {Name = "UnixWare"};
|
||||||
|
case "/usr/lib/libc.so.1" when dellsysv: return new OperatingSystem {Name = "Dell UNIX System V"};
|
||||||
|
case "/usr/lib/libc.so.1" when os2: return new OperatingSystem {Name = "OS/2"};
|
||||||
|
// Other M68K UNIX don't use interpreter or use COFF
|
||||||
|
case "/usr/lib/libc.so.1"
|
||||||
|
when machine == eMachine.EM_68K: return new OperatingSystem {Name = "Amiga UNIX"};
|
||||||
|
case "/usr/lib32/libc.so.1"
|
||||||
|
when machine == eMachine.EM_MIPS: return new OperatingSystem {Name = "IRIX", MajorVersion = 6};
|
||||||
default: return new OperatingSystem {Name = interpreter};
|
default: return new OperatingSystem {Name = interpreter};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user