Use structs for elf symbols decoding
This commit is contained in:
parent
2a35ae7700
commit
31f39f5646
4 changed files with 66 additions and 38 deletions
|
@ -1,9 +1,12 @@
|
||||||
using ARMeilleure.Memory;
|
using ARMeilleure.Memory;
|
||||||
|
using Ryujinx.Common;
|
||||||
using Ryujinx.HLE.HOS.Diagnostics.Demangler;
|
using Ryujinx.HLE.HOS.Diagnostics.Demangler;
|
||||||
using Ryujinx.HLE.HOS.Kernel.Memory;
|
using Ryujinx.HLE.HOS.Kernel.Memory;
|
||||||
using Ryujinx.HLE.Loaders.Elf;
|
using Ryujinx.HLE.Loaders.Elf;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
|
@ -87,9 +90,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: This is the return address, we need to subtract one instruction
|
AppendTrace(_owner.CpuMemory.ReadInt32(framePointer + 4));
|
||||||
// worth of bytes to get the branch instruction address.
|
|
||||||
AppendTrace(_owner.CpuMemory.ReadInt32(framePointer + 4) - 4);
|
|
||||||
|
|
||||||
framePointer = _owner.CpuMemory.ReadInt32(framePointer);
|
framePointer = _owner.CpuMemory.ReadInt32(framePointer);
|
||||||
}
|
}
|
||||||
|
@ -107,9 +108,7 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: This is the return address, we need to subtract one instruction
|
AppendTrace(_owner.CpuMemory.ReadInt64(framePointer + 8));
|
||||||
// worth of bytes to get the branch instruction address.
|
|
||||||
AppendTrace(_owner.CpuMemory.ReadInt64(framePointer + 8) - 4);
|
|
||||||
|
|
||||||
framePointer = _owner.CpuMemory.ReadInt64(framePointer);
|
framePointer = _owner.CpuMemory.ReadInt64(framePointer);
|
||||||
}
|
}
|
||||||
|
@ -133,9 +132,9 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
|
|
||||||
ElfSymbol symbol = image.Symbols[middle];
|
ElfSymbol symbol = image.Symbols[middle];
|
||||||
|
|
||||||
long endAddr = symbol.Value + symbol.Size;
|
ulong endAddr = symbol.Value + symbol.Size;
|
||||||
|
|
||||||
if ((ulong)address >= (ulong)symbol.Value && (ulong)address < (ulong)endAddr)
|
if ((ulong)address >= symbol.Value && (ulong)address < endAddr)
|
||||||
{
|
{
|
||||||
name = symbol.Name;
|
name = symbol.Name;
|
||||||
|
|
||||||
|
@ -326,12 +325,11 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
|
|
||||||
private ElfSymbol GetSymbol64(MemoryManager memory, long address, long strTblAddr)
|
private ElfSymbol GetSymbol64(MemoryManager memory, long address, long strTblAddr)
|
||||||
{
|
{
|
||||||
int nameIndex = memory.ReadInt32(address + 0);
|
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(memory.ReadBytes(address, Unsafe.SizeOf<ElfSymbol64>()))))
|
||||||
int info = memory.ReadByte (address + 4);
|
{
|
||||||
int other = memory.ReadByte (address + 5);
|
ElfSymbol64 sym = inputStream.ReadStruct<ElfSymbol64>();
|
||||||
int shIdx = memory.ReadInt16(address + 6);
|
|
||||||
long value = memory.ReadInt64(address + 8);
|
uint nameIndex = sym.NameOffset;
|
||||||
long size = memory.ReadInt64(address + 16);
|
|
||||||
|
|
||||||
string name = string.Empty;
|
string name = string.Empty;
|
||||||
|
|
||||||
|
@ -340,17 +338,17 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
name += (char)chr;
|
name += (char)chr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ElfSymbol(name, info, other, shIdx, value, size);
|
return new ElfSymbol(name, sym.Info, sym.Other, sym.SectionIndex, sym.ValueAddress, sym.Size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ElfSymbol GetSymbol32(MemoryManager memory, long address, long strTblAddr)
|
private ElfSymbol GetSymbol32(MemoryManager memory, long address, long strTblAddr)
|
||||||
{
|
{
|
||||||
int nameIndex = memory.ReadInt32(address + 0);
|
using (BinaryReader inputStream = new BinaryReader(new MemoryStream(memory.ReadBytes(address, Unsafe.SizeOf<ElfSymbol32>()))))
|
||||||
int info = memory.ReadByte (address + 4);
|
{
|
||||||
int other = memory.ReadByte (address + 5);
|
ElfSymbol32 sym = inputStream.ReadStruct<ElfSymbol32>();
|
||||||
int shIdx = memory.ReadByte (address + 12);
|
|
||||||
long value = memory.ReadByte (address + 13);
|
uint nameIndex = sym.NameOffset;
|
||||||
long size = memory.ReadInt16(address + 14);
|
|
||||||
|
|
||||||
string name = string.Empty;
|
string name = string.Empty;
|
||||||
|
|
||||||
|
@ -359,7 +357,8 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
name += (char)chr;
|
name += (char)chr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ElfSymbol(name, info, other, shIdx, value, size);
|
return new ElfSymbol(name, sym.Info, sym.Other, sym.SectionIndex, sym.ValueAddress, sym.Size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -17,16 +17,16 @@ namespace Ryujinx.HLE.Loaders.Elf
|
||||||
Binding == ElfSymbolBinding.StbWeak;
|
Binding == ElfSymbolBinding.StbWeak;
|
||||||
|
|
||||||
public int ShIdx { get; private set; }
|
public int ShIdx { get; private set; }
|
||||||
public long Value { get; private set; }
|
public ulong Value { get; private set; }
|
||||||
public long Size { get; private set; }
|
public ulong Size { get; private set; }
|
||||||
|
|
||||||
public ElfSymbol(
|
public ElfSymbol(
|
||||||
string name,
|
string name,
|
||||||
int info,
|
int info,
|
||||||
int other,
|
int other,
|
||||||
int shIdx,
|
int shIdx,
|
||||||
long value,
|
ulong value,
|
||||||
long size)
|
ulong size)
|
||||||
{
|
{
|
||||||
Name = name;
|
Name = name;
|
||||||
Type = (ElfSymbolType)(info & 0xf);
|
Type = (ElfSymbolType)(info & 0xf);
|
||||||
|
|
17
Ryujinx.HLE/Loaders/Elf/ElfSymbol32.cs
Normal file
17
Ryujinx.HLE/Loaders/Elf/ElfSymbol32.cs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
namespace Ryujinx.HLE.Loaders.Elf
|
||||||
|
{
|
||||||
|
struct ElfSymbol32
|
||||||
|
{
|
||||||
|
public uint NameOffset;
|
||||||
|
public uint ValueAddress;
|
||||||
|
public uint Size;
|
||||||
|
public char Info;
|
||||||
|
public char Other;
|
||||||
|
public ushort SectionIndex;
|
||||||
|
|
||||||
|
public string GetName()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
12
Ryujinx.HLE/Loaders/Elf/ElfSymbol64.cs
Normal file
12
Ryujinx.HLE/Loaders/Elf/ElfSymbol64.cs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
namespace Ryujinx.HLE.Loaders.Elf
|
||||||
|
{
|
||||||
|
struct ElfSymbol64
|
||||||
|
{
|
||||||
|
public uint NameOffset;
|
||||||
|
public char Info;
|
||||||
|
public char Other;
|
||||||
|
public ushort SectionIndex;
|
||||||
|
public ulong ValueAddress;
|
||||||
|
public ulong Size;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue