From b8c44707e43e38ef248bd95dcff7712c23b349ee Mon Sep 17 00:00:00 2001 From: Kareem Khazem Date: Mon, 27 Mar 2023 14:40:23 +0100 Subject: [PATCH 1/2] 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/5548CC6D.1040708@citrix.com/T/ This commit turns the error into a warning and synthesizes a null pointer for such symbols. --- src/goto-cc/linker_script_merge.cpp | 9 ++++++--- src/goto-cc/linker_script_merge.h | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/goto-cc/linker_script_merge.cpp b/src/goto-cc/linker_script_merge.cpp index 9d8a071941f..987966b5dcc 100644 --- a/src/goto-cc/linker_script_merge.cpp +++ b/src/goto-cc/linker_script_merge.cpp @@ -728,16 +728,19 @@ int linker_script_merget::get_linker_script_data( int linker_script_merget::goto_and_object_mismatch( const std::list &linker_defined_symbols, - const linker_valuest &linker_values) + linker_valuest &linker_values) { int fail=0; for(const auto &sym : linker_defined_symbols) if(linker_values.find(sym)==linker_values.end()) { - fail=1; - log.error() << "Variable '" << sym + log.warning() << "Variable '" << sym << "' was declared extern but never given " << "a value, even in a linker script" << messaget::eom; + + null_pointer_exprt null_pointer(pointer_type(char_type())); + symbol_exprt null_sym(sym, pointer_type(char_type())); + linker_values.emplace(sym, std::make_pair(null_sym, null_pointer)); } for(const auto &pair : linker_values) diff --git a/src/goto-cc/linker_script_merge.h b/src/goto-cc/linker_script_merge.h index b6fcd26ae74..5e19a0258de 100644 --- a/src/goto-cc/linker_script_merge.h +++ b/src/goto-cc/linker_script_merge.h @@ -198,7 +198,7 @@ class linker_script_merget /// everything is OK. int goto_and_object_mismatch( const std::list &linker_defined_symbols, - const linker_valuest &linker_values); + linker_valuest &linker_values); /// \brief Validate output of the `scripts/ls_parse.py` tool int linker_data_is_malformed(const jsont &data) const; From b40be482a798c1f839d688ca8e3c87aadd04d245 Mon Sep 17 00:00:00 2001 From: Kareem Khazem Date: Mon, 27 Mar 2023 14:41:05 +0100 Subject: [PATCH 2/2] Fix whitespace --- src/goto-cc/linker_script_merge.cpp | 8 ++++---- src/goto-cc/linker_script_merge.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/goto-cc/linker_script_merge.cpp b/src/goto-cc/linker_script_merge.cpp index 987966b5dcc..97f37165f9a 100644 --- a/src/goto-cc/linker_script_merge.cpp +++ b/src/goto-cc/linker_script_merge.cpp @@ -727,16 +727,16 @@ int linker_script_merget::get_linker_script_data( } int linker_script_merget::goto_and_object_mismatch( - const std::list &linker_defined_symbols, - linker_valuest &linker_values) + const std::list &linker_defined_symbols, + linker_valuest &linker_values) { int fail=0; for(const auto &sym : linker_defined_symbols) if(linker_values.find(sym)==linker_values.end()) { log.warning() << "Variable '" << sym - << "' was declared extern but never given " - << "a value, even in a linker script" << messaget::eom; + << "' was declared extern but never given a value, even in " + << "a linker script" << messaget::eom; null_pointer_exprt null_pointer(pointer_type(char_type())); symbol_exprt null_sym(sym, pointer_type(char_type())); diff --git a/src/goto-cc/linker_script_merge.h b/src/goto-cc/linker_script_merge.h index 5e19a0258de..338d51c13d6 100644 --- a/src/goto-cc/linker_script_merge.h +++ b/src/goto-cc/linker_script_merge.h @@ -197,8 +197,8 @@ class linker_script_merget /// \return `1` if there is some mismatch between the list and map, `0` if /// everything is OK. int goto_and_object_mismatch( - const std::list &linker_defined_symbols, - linker_valuest &linker_values); + const std::list &linker_defined_symbols, + linker_valuest &linker_values); /// \brief Validate output of the `scripts/ls_parse.py` tool int linker_data_is_malformed(const jsont &data) const;