Skip to content

Commit 0c70358

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 0c70358

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/goto-cc/linker_script_merge.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -728,16 +728,22 @@ 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
739-
<< "' was declared extern but never given "
740-
<< "a value, even in a linker script" << messaget::eom;
737+
log.warning()
738+
<< "Variable '" << sym
739+
<< "' was declared extern but never given a value, even in "
740+
<< "a linker script"
741+
<< messaget::eom;
742+
743+
null_pointer_exprt null_pointer(pointer_type(char_type()));
744+
symbol_exprt null_sym(pointer_type(char_type()));
745+
null_sym.set_identifier(sym);
746+
linker_values.emplace(sym, std::make_pair(null_sym, null_pointer));
741747
}
742748

743749
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)