diff options
author | Cary Coutant <ccoutant@gmail.com> | 2015-08-25 17:41:19 -0700 |
---|---|---|
committer | Cary Coutant <ccoutant@gmail.com> | 2015-08-25 18:11:19 -0700 |
commit | 1757d35c8a35d77fd631705589024456c6030966 (patch) | |
tree | 6b9cfb352abc1980b94d9bc7c9dbe89e8ceba4c8 /gold/script.h | |
parent | 3ac0a36c297a7bb3325c6efa756cccc40572dbdb (diff) | |
download | binutils-gdb-1757d35c8a35d77fd631705589024456c6030966.tar.gz |
Fix internal error in gold when script uses section address in assignment.
When processing assignment expressions in a linker script, gold processes
absolute assignments early, but when one of those assignments involves the
address of a section that has not yet been finalized, we get an internal
error in address. This patch fixes the problem by gracefully returning
from expression evaluation even if the address is not yet valid, and
deferring the assignment in such a case.
gold/
PR gold/14746
* expression.cc (Expression::Expression_eval_info): Add
is_valid_pointer field.
(Expression::eval_maybe_dot): Add is_valid_pointer parameter.
Adjust all callers.
(Addr_expression::value_from_output_section): Check whether address
is valid.
* script.cc (Symbol_assignment::set_if_absolute): Defer assignment
if evaluation failed due to address that is not yet valid.
* script.h: (Expression::eval_maybe_dot): Add is_valid_pointer
parameter.
Diffstat (limited to 'gold/script.h')
-rw-r--r-- | gold/script.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/gold/script.h b/gold/script.h index 1731985d83e..739baf16ed0 100644 --- a/gold/script.h +++ b/gold/script.h @@ -113,7 +113,7 @@ class Expression Output_section* dot_section, Output_section** result_section, uint64_t* result_alignment, elfcpp::STT* type, elfcpp::STV* vis, unsigned char* nonvis, - bool is_section_dot_assignment); + bool is_section_dot_assignment, bool* is_valid_pointer); // Print the expression to the FILE. This is for debugging. virtual void |