aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Core/Loaders
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Core/Loaders')
-rw-r--r--Ryujinx.Core/Loaders/ElfSym.cs9
-rw-r--r--Ryujinx.Core/Loaders/Executable.cs30
2 files changed, 27 insertions, 12 deletions
diff --git a/Ryujinx.Core/Loaders/ElfSym.cs b/Ryujinx.Core/Loaders/ElfSym.cs
index 35a45500..89e7c61f 100644
--- a/Ryujinx.Core/Loaders/ElfSym.cs
+++ b/Ryujinx.Core/Loaders/ElfSym.cs
@@ -16,17 +16,15 @@ namespace Ryujinx.Core.Loaders
Binding == ElfSymBinding.STB_GLOBAL ||
Binding == ElfSymBinding.STB_WEAK;
- public int SHIdx { get; private set; }
- public long ValueAbs { get; private set; }
- public long Value { get; private set; }
- public long Size { get; private set; }
+ public int SHIdx { get; private set; }
+ public long Value { get; private set; }
+ public long Size { get; private set; }
public ElfSym(
string Name,
int Info,
int Other,
int SHIdx,
- long ImageBase,
long Value,
long Size)
{
@@ -35,7 +33,6 @@ namespace Ryujinx.Core.Loaders
this.Binding = (ElfSymBinding)(Info >> 4);
this.Visibility = (ElfSymVisibility)Other;
this.SHIdx = SHIdx;
- this.ValueAbs = Value + ImageBase;
this.Value = Value;
this.Size = Size;
}
diff --git a/Ryujinx.Core/Loaders/Executable.cs b/Ryujinx.Core/Loaders/Executable.cs
index e2660838..c6770c7b 100644
--- a/Ryujinx.Core/Loaders/Executable.cs
+++ b/Ryujinx.Core/Loaders/Executable.cs
@@ -9,13 +9,21 @@ namespace Ryujinx.Core.Loaders
{
private AMemory Memory;
- private ElfDyn[] Dynamic;
+ private List<ElfDyn> Dynamic;
+
+ private Dictionary<long, string> m_SymbolTable;
+
+ public IReadOnlyDictionary<long, string> SymbolTable => m_SymbolTable;
public long ImageBase { get; private set; }
public long ImageEnd { get; private set; }
public Executable(IExecutable Exe, AMemory Memory, long ImageBase)
{
+ Dynamic = new List<ElfDyn>();
+
+ m_SymbolTable = new Dictionary<long, string>();
+
this.Memory = Memory;
this.ImageBase = ImageBase;
this.ImageEnd = ImageBase;
@@ -48,9 +56,7 @@ namespace Ryujinx.Core.Loaders
MapBss(BssStartOffset, BssEndOffset - BssStartOffset);
- ImageEnd = BssEndOffset;
-
- List<ElfDyn> Dynamic = new List<ElfDyn>();
+ ImageEnd = ImageBase + BssEndOffset;
while (true)
{
@@ -69,7 +75,19 @@ namespace Ryujinx.Core.Loaders
Dynamic.Add(new ElfDyn(Tag, Value));
}
- this.Dynamic = Dynamic.ToArray();
+ long StrTblAddr = ImageBase + GetFirstValue(ElfDynTag.DT_STRTAB);
+ long SymTblAddr = ImageBase + GetFirstValue(ElfDynTag.DT_SYMTAB);
+
+ long SymEntSize = GetFirstValue(ElfDynTag.DT_SYMENT);
+
+ while ((ulong)SymTblAddr < (ulong)StrTblAddr)
+ {
+ ElfSym Sym = GetSymbol(SymTblAddr, StrTblAddr);
+
+ m_SymbolTable.TryAdd(Sym.Value, Sym.Name);
+
+ SymTblAddr += SymEntSize;
+ }
}
private void WriteData(
@@ -135,7 +153,7 @@ namespace Ryujinx.Core.Loaders
Name += (char)Chr;
}
- return new ElfSym(Name, Info, Other, SHIdx, ImageBase, Value, Size);
+ return new ElfSym(Name, Info, Other, SHIdx, Value, Size);
}
private long GetFirstValue(ElfDynTag Tag)