mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-02-18 08:30:11 +00:00
Merge remote-tracking branch 'origin/GP-4521_dev747368_fix_dwarf_golang_error_reporting'
This commit is contained in:
commit
a10b9aa894
@ -654,18 +654,15 @@ public class GolangSymbolAnalyzer extends AbstractAnalyzer {
|
|||||||
FunctionDefinitionDataType signature =
|
FunctionDefinitionDataType signature =
|
||||||
new FunctionDefinitionDataType(callsite.calledFunc, true);
|
new FunctionDefinitionDataType(callsite.calledFunc, true);
|
||||||
signature.setReturnType(newReturnType);
|
signature.setReturnType(newReturnType);
|
||||||
try {
|
HighFunctionDBUtil.writeOverride(callsite.callingFunc,
|
||||||
HighFunctionDBUtil.writeOverride(callsite.callingFunc,
|
callsite.ref.getFromAddress(), signature);
|
||||||
callsite.ref.getFromAddress(), signature);
|
|
||||||
}
|
|
||||||
catch (InvalidInputException e) {
|
|
||||||
Msg.error(this, "Failed to override call", e);
|
|
||||||
}
|
|
||||||
fixedCallsiteCount++;
|
fixedCallsiteCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException | InvalidInputException e) {
|
||||||
Msg.error(this, "Failed to override call", e);
|
markupSession.logWarningAt(callsite.ref.getFromAddress(),
|
||||||
|
"Failed to override with RTTI: " + e.getMessage());
|
||||||
|
unfixedCallsiteCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ import ghidra.app.util.bin.BinaryReader;
|
|||||||
*/
|
*/
|
||||||
public enum DWARFAttribute {
|
public enum DWARFAttribute {
|
||||||
DW_AT_sibling(0x1, reference),
|
DW_AT_sibling(0x1, reference),
|
||||||
DW_AT_location(0x2, exprloc, loclist),
|
DW_AT_location(0x2, exprloc, loclist, block),
|
||||||
DW_AT_name(0x3, string),
|
DW_AT_name(0x3, string),
|
||||||
DW_AT_ordering(0x9, constant),
|
DW_AT_ordering(0x9, constant),
|
||||||
//DW_AT_subscr_data(0xa),
|
//DW_AT_subscr_data(0xa),
|
||||||
@ -78,7 +78,7 @@ public enum DWARFAttribute {
|
|||||||
DW_AT_discr_list(0x3d, block),
|
DW_AT_discr_list(0x3d, block),
|
||||||
DW_AT_encoding(0x3e, constant),
|
DW_AT_encoding(0x3e, constant),
|
||||||
DW_AT_external(0x3f, flag),
|
DW_AT_external(0x3f, flag),
|
||||||
DW_AT_frame_base(0x40, exprloc, loclist),
|
DW_AT_frame_base(0x40, exprloc, loclist, block),
|
||||||
DW_AT_friend(0x41, reference),
|
DW_AT_friend(0x41, reference),
|
||||||
DW_AT_identifier_case(0x42, constant),
|
DW_AT_identifier_case(0x42, constant),
|
||||||
DW_AT_macro_info(0x43, macptr),
|
DW_AT_macro_info(0x43, macptr),
|
||||||
|
@ -20,6 +20,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import ghidra.app.util.bin.format.dwarf.DWARFUtil;
|
import ghidra.app.util.bin.format.dwarf.DWARFUtil;
|
||||||
import ghidra.app.util.bin.format.golang.rtti.GoRttiMapper;
|
import ghidra.app.util.bin.format.golang.rtti.GoRttiMapper;
|
||||||
|
import ghidra.app.util.bin.format.golang.structmapping.MarkupSession;
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.data.*;
|
import ghidra.program.model.data.*;
|
||||||
import ghidra.program.model.lang.Register;
|
import ghidra.program.model.lang.Register;
|
||||||
@ -27,7 +28,6 @@ import ghidra.program.model.listing.*;
|
|||||||
import ghidra.program.model.listing.Function.FunctionUpdateType;
|
import ghidra.program.model.listing.Function.FunctionUpdateType;
|
||||||
import ghidra.program.model.pcode.Varnode;
|
import ghidra.program.model.pcode.Varnode;
|
||||||
import ghidra.program.model.symbol.*;
|
import ghidra.program.model.symbol.*;
|
||||||
import ghidra.util.Msg;
|
|
||||||
import ghidra.util.exception.DuplicateNameException;
|
import ghidra.util.exception.DuplicateNameException;
|
||||||
import ghidra.util.exception.InvalidInputException;
|
import ghidra.util.exception.InvalidInputException;
|
||||||
|
|
||||||
@ -91,10 +91,9 @@ public class GoFunctionFixup {
|
|||||||
spillVars.add(newParam);
|
spillVars.add(newParam);
|
||||||
if (dt instanceof Structure &&
|
if (dt instanceof Structure &&
|
||||||
newParam.getVariableStorage().size() != dt.getLength()) {
|
newParam.getVariableStorage().size() != dt.getLength()) {
|
||||||
Msg.warn(GoFunctionFixup.class,
|
MarkupSession.logWarningAt(program, func.getEntryPoint(),
|
||||||
"Known storage allocation problem: func %s@%s param %s register allocation for structs missing inter-field padding."
|
"Known storage allocation problem: param %s register allocation for structs missing inter-field padding."
|
||||||
.formatted(func.getName(), func.getEntryPoint(),
|
.formatted(newParam.toString()));
|
||||||
newParam.toString()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -121,8 +120,15 @@ public class GoFunctionFixup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update the function in Ghidra
|
// Update the function in Ghidra
|
||||||
func.updateFunction(null, returnParam, newParams, FunctionUpdateType.CUSTOM_STORAGE, true,
|
try {
|
||||||
SourceType.USER_DEFINED);
|
func.updateFunction(null, returnParam, newParams, FunctionUpdateType.CUSTOM_STORAGE,
|
||||||
|
true, SourceType.USER_DEFINED);
|
||||||
|
}
|
||||||
|
catch (DuplicateNameException | InvalidInputException e) {
|
||||||
|
MarkupSession.logWarningAt(program, func.getEntryPoint(),
|
||||||
|
"Failed to update function signature: " + e.getMessage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Remove any old local vars that are in the callers stack instead of in the local stack area
|
// Remove any old local vars that are in the callers stack instead of in the local stack area
|
||||||
for (Variable localVar : func.getLocalVariables()) {
|
for (Variable localVar : func.getLocalVariables()) {
|
||||||
|
@ -157,7 +157,8 @@ public class MarkupSession {
|
|||||||
markedupAddrs.add(data.getMinAddress(), data.getMaxAddress());
|
markedupAddrs.add(data.getMinAddress(), data.getMaxAddress());
|
||||||
}
|
}
|
||||||
catch (CodeUnitInsertionException e) {
|
catch (CodeUnitInsertionException e) {
|
||||||
throw new IOException(e);
|
logWarningAt(addr,
|
||||||
|
"Failed to apply data type [%s]: %s".formatted(dt.getName(), e.getMessage()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -230,7 +231,7 @@ public class MarkupSession {
|
|||||||
newLabelSym.setPrimary();
|
newLabelSym.setPrimary();
|
||||||
}
|
}
|
||||||
catch (InvalidInputException e) {
|
catch (InvalidInputException e) {
|
||||||
throw new IOException(e);
|
logWarningAt(addr, "Failed to label [%s]: %s".formatted(symbolName, e.getMessage()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -425,4 +426,18 @@ public class MarkupSession {
|
|||||||
refMgr.addMemoryReference(fieldAddr, refDest, RefType.DATA, SourceType.IMPORTED, 0);
|
refMgr.addMemoryReference(fieldAddr, refDest, RefType.DATA, SourceType.IMPORTED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void logWarningAt(Address addr, String msg) {
|
||||||
|
logWarningAt(program, addr, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void logWarningAt(Program program, Address addr, String msg) {
|
||||||
|
BookmarkManager bmm = program.getBookmarkManager();
|
||||||
|
Bookmark existingBM = bmm.getBookmark(addr, BookmarkType.WARNING, "Golang");
|
||||||
|
String existingTxt = existingBM != null ? existingBM.getComment() : "";
|
||||||
|
if (existingTxt.contains(msg)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msg = !existingTxt.isEmpty() ? existingTxt + "; " + msg : msg;
|
||||||
|
bmm.setBookmark(addr, BookmarkType.WARNING, "Golang", msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user