975f8a9e31
Giving linker script symbols defined outside of output sections a section-relative value early, leads to them being used in expressions as if they were defined inside an output section. This can mean loss of the section VMA, and wrong results. ld/ PR ld/18963 * ldexp.h (struct ldexp_control): Add rel_from_abs. (ldexp_finalize_syms): Declare. * ldexp.c (new_rel_from_abs): Keep absolute for expressions outside of output section statements. Set rel_from_abs. (make_abs, exp_fold_tree, exp_fold_tree_no_dot): Clear rel_from_abs. (struct definedness_hash_entry): Add final_sec, and comment. (update_definedness): Set final_sec. (set_sym_sections, ldexp_finalize_syms): New functions. * ldlang.c (lang_process): Call ldexp_finalize_syms. ld/testsuite PR ld/18963 * ld-scripts/pr18963.d, * ld-scripts/pr18963.t: New test. * ld-scripts/expr.exp: Run it. * ld-elf/provide-hidden-2.ld: Explicitly make "dot" absolute. * ld-mips-elf/gp-hidden.sd: Don't care about _gp section. * ld-mips-elf/no-shared-1-n32.d: Don't care about symbol shown at start of .data section. * ld-mips-elf/no-shared-1-n64.d: Likewise. * ld-mips-elf/no-shared-1-o32.d: Likewise.
25 lines
278 B
Perl
25 lines
278 B
Perl
SECTIONS
|
|
{
|
|
. = 0x80000;
|
|
A = .;
|
|
.text :
|
|
{
|
|
_start = .;
|
|
. = 0x10000;
|
|
}
|
|
B = .;
|
|
.data :
|
|
{
|
|
. = 0x10000;
|
|
}
|
|
C = .;
|
|
.bss :
|
|
{
|
|
. = 0x10000;
|
|
}
|
|
D = A - C + B;
|
|
E = A + B - C;
|
|
/DISCARD/ : {*(*)}
|
|
}
|
|
|
|
ASSERT(D == E, "Addition is not commutative");
|