Skip to content

Commit d12f170

Browse files
Enhance get_gopclntab function
1 parent 7640956 commit d12f170

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

src/main/java/golanganalyzerextension/GolangAnalyzerExtensionAnalyzer.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,8 @@ public boolean added(Program program, AddressSetView set, TaskMonitor monitor, M
111111
int func_name_offset=0;
112112
int args=0;
113113
try {
114-
if(pointer_size==8) {
115-
func_addr_value=memory.getLong(func_list_base.add(i*pointer_size*2));
116-
func_info_offset=memory.getLong(func_list_base.add(i*pointer_size*2+pointer_size));
117-
}else {
118-
func_addr_value=memory.getInt(func_list_base.add(i*pointer_size*2));
119-
func_info_offset=memory.getInt(func_list_base.add(i*pointer_size*2+pointer_size));
120-
}
114+
func_addr_value=get_address_value(memory, func_list_base.add(i*pointer_size*2), pointer_size);
115+
func_info_offset=get_address_value(memory, func_list_base.add(i*pointer_size*2+pointer_size), pointer_size);
121116
long func_entry_value=memory.getInt(base.add(func_info_offset));
122117
func_name_offset=memory.getInt(base.add(func_info_offset+pointer_size));
123118
args=memory.getInt(base.add(func_info_offset+pointer_size+4));
@@ -150,6 +145,15 @@ int get_pointer_size(Program program) {
150145
return 4;
151146
}
152147

148+
long get_address_value(Memory memory, Address address, int size) throws MemoryAccessException {
149+
if(size==8) {
150+
return memory.getLong(address);
151+
}else if(size==4) {
152+
return memory.getInt(address);
153+
}
154+
return memory.getByte(address);
155+
}
156+
153157
Address get_gopclntab(Program program, TaskMonitor monitor) {
154158
MemoryBlock gopclntab_section=null;
155159
for (MemoryBlock mb : program.getMemory().getBlocks()) {
@@ -162,16 +166,30 @@ Address get_gopclntab(Program program, TaskMonitor monitor) {
162166
}
163167

164168
byte magic[]= {(byte)0xfb,(byte)0xff,(byte)0xff,(byte)0xff};
165-
Address find=null;
169+
Address base=null;
166170
while(true) {
167-
find=program.getMemory().findBytes(find, magic, new byte[] {(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff}, true, monitor);
168-
if(find==null) {
171+
base=program.getMemory().findBytes(base, magic, new byte[] {(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff}, true, monitor);
172+
if(base==null) {
169173
break;
170174
}
171-
find=find.add(4);
175+
176+
int pointer_size=get_pointer_size(program);
177+
Memory memory=program.getMemory();
178+
Address func_list_base=base.add(8+pointer_size);
179+
try {
180+
long func_addr_value=get_address_value(memory, func_list_base.add(0), pointer_size);
181+
long func_info_offset=get_address_value(memory, func_list_base.add(pointer_size), pointer_size);
182+
long func_entry_value=memory.getInt(base.add(func_info_offset));
183+
if(func_addr_value==func_entry_value)
184+
{
185+
break;
186+
}
187+
}catch(MemoryAccessException e) {
188+
}
189+
base=base.add(4);
172190
}
173191

174-
return find;
192+
return base;
175193
}
176194

177195
String create_function_name_data(Program program, Address address) throws CodeUnitInsertionException {

0 commit comments

Comments
 (0)