Skip to content

Commit b8c4470

Browse files
committed
Do not error on undef extern linker symbols
goto-cc currently parses the linker script given by the -T flag to find addresses for variables that are extern-declared in C files but not given a definition. This is because some variables are defined in the linker script, not in C code, and reading these definitions from the linker script is necessary to verify the C program. Prior to this commit, goto-cc would error out if some extern-defined variables remained undefined even after reading the linker script. There is actually a valid use case for having undefined symbols even after linking, see this (search for "Undefined symbol to cause link failure"): https://lore.kernel.org/all/[email protected]/T/ This commit turns the error into a warning and synthesizes a null pointer for such symbols.
1 parent 9f894ae commit b8c4470

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

src/goto-cc/linker_script_merge.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -728,16 +728,19 @@ int linker_script_merget::get_linker_script_data(
728728

729729
int linker_script_merget::goto_and_object_mismatch(
730730
const std::list<irep_idt> &linker_defined_symbols,
731-
const linker_valuest &linker_values)
731+
linker_valuest &linker_values)
732732
{
733733
int fail=0;
734734
for(const auto &sym : linker_defined_symbols)
735735
if(linker_values.find(sym)==linker_values.end())
736736
{
737-
fail=1;
738-
log.error() << "Variable '" << sym
737+
log.warning() << "Variable '" << sym
739738
<< "' was declared extern but never given "
740739
<< "a value, even in a linker script" << messaget::eom;
740+
741+
null_pointer_exprt null_pointer(pointer_type(char_type()));
742+
symbol_exprt null_sym(sym, pointer_type(char_type()));
743+
linker_values.emplace(sym, std::make_pair(null_sym, null_pointer));
741744
}
742745

743746
for(const auto &pair : linker_values)

src/goto-cc/linker_script_merge.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class linker_script_merget
198198
/// everything is OK.
199199
int goto_and_object_mismatch(
200200
const std::list<irep_idt> &linker_defined_symbols,
201-
const linker_valuest &linker_values);
201+
linker_valuest &linker_values);
202202

203203
/// \brief Validate output of the `scripts/ls_parse.py` tool
204204
int linker_data_is_malformed(const jsont &data) const;

0 commit comments

Comments
 (0)