Skip to content

Commit d699599

Browse files
committed
使用正确的方式获取符号数量
1 parent 2bc03a5 commit d699599

File tree

3 files changed

+83
-6
lines changed

3 files changed

+83
-6
lines changed

Il2CppDumper/ExecutableFormats/Elf.cs

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,48 @@ private void ReadSymbol()
190190
{
191191
try
192192
{
193+
var symbolCount = 0u;
194+
var hash = dynamicSection.FirstOrDefault(x => x.d_tag == DT_HASH);
195+
if (hash != null)
196+
{
197+
var addr = MapVATR(hash.d_un);
198+
Position = addr;
199+
var nbucket = ReadUInt32();
200+
var nchain = ReadUInt32();
201+
symbolCount = nchain;
202+
}
203+
else
204+
{
205+
hash = dynamicSection.First(x => x.d_tag == DT_GNU_HASH);
206+
var addr = MapVATR(hash.d_un);
207+
Position = addr;
208+
var nbuckets = ReadUInt32();
209+
var symoffset = ReadUInt32();
210+
var bloom_size = ReadUInt32();
211+
var bloom_shift = ReadUInt32();
212+
var buckets_address = addr + 16 + (4 * bloom_size);
213+
var buckets = ReadClassArray<uint>(buckets_address, nbuckets);
214+
var last_symbol = buckets.Max();
215+
if (last_symbol < symoffset)
216+
{
217+
symbolCount = symoffset;
218+
}
219+
else
220+
{
221+
var chains_base_address = buckets_address + 4 * nbuckets;
222+
Position = chains_base_address + (last_symbol - symoffset) * 4;
223+
while (true)
224+
{
225+
var chain_entry = ReadUInt32();
226+
++last_symbol;
227+
if ((chain_entry & 1) != 0)
228+
break;
229+
}
230+
symbolCount = last_symbol;
231+
}
232+
}
193233
var dynsymOffset = MapVATR(dynamicSection.First(x => x.d_tag == DT_SYMTAB).d_un);
194-
var dynstrOffset = MapVATR(dynamicSection.First(x => x.d_tag == DT_STRTAB).d_un);
195-
var dynsymSize = dynstrOffset - dynsymOffset;
196-
symbolTable = ReadClassArray<Elf32_Sym>(dynsymOffset, (long)dynsymSize / 16);
234+
symbolTable = ReadClassArray<Elf32_Sym>(dynsymOffset, symbolCount);
197235
}
198236
catch
199237
{

Il2CppDumper/ExecutableFormats/Elf64.cs

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,48 @@ private void ReadSymbol()
130130
{
131131
try
132132
{
133+
var symbolCount = 0u;
134+
var hash = dynamicSection.FirstOrDefault(x => x.d_tag == DT_HASH);
135+
if (hash != null)
136+
{
137+
var addr = MapVATR(hash.d_un);
138+
Position = addr;
139+
var nbucket = ReadUInt32();
140+
var nchain = ReadUInt32();
141+
symbolCount = nchain;
142+
}
143+
else
144+
{
145+
hash = dynamicSection.First(x => x.d_tag == DT_GNU_HASH);
146+
var addr = MapVATR(hash.d_un);
147+
Position = addr;
148+
var nbuckets = ReadUInt32();
149+
var symoffset = ReadUInt32();
150+
var bloom_size = ReadUInt32();
151+
var bloom_shift = ReadUInt32();
152+
var buckets_address = addr + 16 + (8 * bloom_size);
153+
var buckets = ReadClassArray<uint>(buckets_address, nbuckets);
154+
var last_symbol = buckets.Max();
155+
if (last_symbol < symoffset)
156+
{
157+
symbolCount = symoffset;
158+
}
159+
else
160+
{
161+
var chains_base_address = buckets_address + 4 * nbuckets;
162+
Position = chains_base_address + (last_symbol - symoffset) * 4;
163+
while (true)
164+
{
165+
var chain_entry = ReadUInt32();
166+
++last_symbol;
167+
if ((chain_entry & 1) != 0)
168+
break;
169+
}
170+
symbolCount = last_symbol;
171+
}
172+
}
133173
var dynsymOffset = MapVATR(dynamicSection.First(x => x.d_tag == DT_SYMTAB).d_un);
134-
var dynstrOffset = MapVATR(dynamicSection.First(x => x.d_tag == DT_STRTAB).d_un);
135-
var dynsymSize = dynstrOffset - dynsymOffset;
136-
symbolTable = ReadClassArray<Elf64_Sym>(dynsymOffset, (long)dynsymSize / 24L);
174+
symbolTable = ReadClassArray<Elf64_Sym>(dynsymOffset, symbolCount);
137175
}
138176
catch
139177
{

Il2CppDumper/ExecutableFormats/ElfClass.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ public static class ElfConstants
172172
public const int DT_JMPREL = 23;
173173
public const int DT_INIT_ARRAY = 25;
174174
public const int DT_FINI_ARRAY = 26;
175+
public const int DT_GNU_HASH = 0x6ffffef5;
175176

176177
public const uint SHT_LOUSER = 0x80000000;
177178

0 commit comments

Comments
 (0)