mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 05:48:40 +00:00
check COMDAT symlink points to a defined symbol
This commit is contained in:
committed by
Ryan Fleury
parent
8d324775a2
commit
3eb7debad5
@@ -236,11 +236,16 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src)
|
|||||||
// regular,common vs regular,common
|
// regular,common vs regular,common
|
||||||
else if ((dst_interp == COFF_SymbolValueInterp_Regular || dst_interp == COFF_SymbolValueInterp_Common) &&
|
else if ((dst_interp == COFF_SymbolValueInterp_Regular || dst_interp == COFF_SymbolValueInterp_Common) &&
|
||||||
(src_interp == COFF_SymbolValueInterp_Regular || src_interp == COFF_SymbolValueInterp_Common)) {
|
(src_interp == COFF_SymbolValueInterp_Regular || src_interp == COFF_SymbolValueInterp_Common)) {
|
||||||
|
U32 dst_comdat_symbol_idx = dst_obj->comdats[dst_parsed.section_number-1];
|
||||||
|
U32 src_comdat_symbol_idx = src_obj->comdats[src_parsed.section_number-1];
|
||||||
|
if (dst_comdat_symbol_idx == ~0 || src_comdat_symbol_idx == ~0) {
|
||||||
|
lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src_obj, "multiply defined symbol %S in %S", dst->name, dst_obj->path);
|
||||||
|
} else {
|
||||||
COFF_ComdatSelectType dst_select;
|
COFF_ComdatSelectType dst_select;
|
||||||
U32 dst_section_length;
|
U32 dst_section_length;
|
||||||
U32 dst_check_sum;
|
U32 dst_check_sum;
|
||||||
if (dst_interp == COFF_SymbolValueInterp_Regular) {
|
if (dst_interp == COFF_SymbolValueInterp_Regular) {
|
||||||
COFF_ParsedSymbol secdef = lnk_parsed_symbol_from_coff_symbol_idx(dst_obj, dst_obj->comdats[dst_parsed.section_number-1]);
|
COFF_ParsedSymbol secdef = lnk_parsed_symbol_from_coff_symbol_idx(dst_obj, dst_comdat_symbol_idx);
|
||||||
coff_parse_secdef(secdef, dst_obj->header.is_big_obj, &dst_select, 0, &dst_section_length, &dst_check_sum);
|
coff_parse_secdef(secdef, dst_obj->header.is_big_obj, &dst_select, 0, &dst_section_length, &dst_check_sum);
|
||||||
} else {
|
} else {
|
||||||
dst_select = COFF_ComdatSelect_Largest;
|
dst_select = COFF_ComdatSelect_Largest;
|
||||||
@@ -252,7 +257,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src)
|
|||||||
U32 src_section_length;
|
U32 src_section_length;
|
||||||
U32 src_check_sum;
|
U32 src_check_sum;
|
||||||
if (src_interp == COFF_SymbolValueInterp_Regular) {
|
if (src_interp == COFF_SymbolValueInterp_Regular) {
|
||||||
COFF_ParsedSymbol secdef = lnk_parsed_symbol_from_coff_symbol_idx(src_obj, src_obj->comdats[src_parsed.section_number-1]);
|
COFF_ParsedSymbol secdef = lnk_parsed_symbol_from_coff_symbol_idx(src_obj, src_comdat_symbol_idx);
|
||||||
coff_parse_secdef(secdef, src_obj->header.is_big_obj, &src_select, 0, &src_section_length, &src_check_sum);
|
coff_parse_secdef(secdef, src_obj->header.is_big_obj, &src_select, 0, &src_section_length, &src_check_sum);
|
||||||
} else {
|
} else {
|
||||||
src_select = COFF_ComdatSelect_Largest;
|
src_select = COFF_ComdatSelect_Largest;
|
||||||
@@ -279,16 +284,16 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src)
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case COFF_ComdatSelect_NoDuplicates: {
|
case COFF_ComdatSelect_NoDuplicates: {
|
||||||
lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src_obj, "multiply defined symbol %S in %S.", dst->name, dst_obj->path);
|
lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src_obj, "multiply defined symbol %S in %S", dst->name, dst_obj->path);
|
||||||
} break;
|
} break;
|
||||||
case COFF_ComdatSelect_SameSize: {
|
case COFF_ComdatSelect_SameSize: {
|
||||||
if (dst_section_length != src_section_length) {
|
if (dst_section_length != src_section_length) {
|
||||||
lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src_obj, "multiply defined symbol %S in %S.", dst->name, dst_obj->path);
|
lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src_obj, "multiply defined symbol %S in %S", dst->name, dst_obj->path);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case COFF_ComdatSelect_ExactMatch: {
|
case COFF_ComdatSelect_ExactMatch: {
|
||||||
if (dst_check_sum != src_check_sum) {
|
if (dst_check_sum != src_check_sum) {
|
||||||
lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src_obj, "multiply defined symbol %S in %S.", dst->name, dst_obj->path);
|
lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, src_obj, "multiply defined symbol %S in %S", dst->name, dst_obj->path);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case COFF_ComdatSelect_Largest: {
|
case COFF_ComdatSelect_Largest: {
|
||||||
@@ -317,6 +322,7 @@ lnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src)
|
|||||||
"%S: COMDAT selection conflict detected, current selection %S, leader selection %S from %S",
|
"%S: COMDAT selection conflict detected, current selection %S, leader selection %S from %S",
|
||||||
src->name, src_select_str, dst_select_str, dst_obj);
|
src->name, src_select_str, dst_select_str, dst_obj);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
lnk_error(LNK_Error_InvalidPath, "unable to find a suitable replacement logic for symbol combination");
|
lnk_error(LNK_Error_InvalidPath, "unable to find a suitable replacement logic for symbol combination");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user