diff options
Diffstat (limited to 'Ryujinx.HLE/Loaders/Executable.cs')
| -rw-r--r-- | Ryujinx.HLE/Loaders/Executable.cs | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/Ryujinx.HLE/Loaders/Executable.cs b/Ryujinx.HLE/Loaders/Executable.cs index 6a3f0b97..a9850e4a 100644 --- a/Ryujinx.HLE/Loaders/Executable.cs +++ b/Ryujinx.HLE/Loaders/Executable.cs @@ -3,18 +3,21 @@ using Ryujinx.HLE.HOS; using Ryujinx.HLE.HOS.Kernel; using Ryujinx.HLE.Loaders.Executables; using Ryujinx.HLE.Utilities; +using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.IO; +using System.Linq; namespace Ryujinx.HLE.Loaders { class Executable { - private List<ElfDyn> Dynamic; + private AMemory Memory; - private Dictionary<long, string> m_SymbolTable; + private List<ElfDyn> Dynamic; - public IReadOnlyDictionary<long, string> SymbolTable => m_SymbolTable; + public ReadOnlyCollection<ElfSym> SymbolTable; public string Name { get; private set; } @@ -23,16 +26,12 @@ namespace Ryujinx.HLE.Loaders public long ImageBase { get; private set; } public long ImageEnd { get; private set; } - private AMemory Memory; - private KMemoryManager MemoryManager; public Executable(IExecutable Exe, KMemoryManager MemoryManager, AMemory Memory, long ImageBase) { Dynamic = new List<ElfDyn>(); - m_SymbolTable = new Dictionary<long, string>(); - FilePath = Exe.FilePath; if (FilePath != null) @@ -103,14 +102,18 @@ namespace Ryujinx.HLE.Loaders long SymEntSize = GetFirstValue(ElfDynTag.DT_SYMENT); + List<ElfSym> Symbols = new List<ElfSym>(); + while ((ulong)SymTblAddr < (ulong)StrTblAddr) { ElfSym Sym = GetSymbol(SymTblAddr, StrTblAddr); - m_SymbolTable.TryAdd(Sym.Value, Sym.Name); + Symbols.Add(Sym); SymTblAddr += SymEntSize; } + + SymbolTable = Array.AsReadOnly(Symbols.OrderBy(x => x.Value).ToArray()); } private ElfRel GetRelocation(long Position) |
