@@ -130,10 +130,48 @@ private void ReadSymbol()
130
130
{
131
131
try
132
132
{
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
+ }
133
173
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 ) ;
137
175
}
138
176
catch
139
177
{
0 commit comments