LD: Always make a SEGMENT_START expression section-relative
Fix an issue with the SEGMENT_START builtin function where its result is absolute when taken from the default supplied, and section-relative when taken from a `-T' command-line override. This is against documentation, inconsistent and unexpected, and with PIE executables gives an incorrect result with the `__executable_start' symbol. Make the result of SEGMENT_START always section-relative then. ld/ * ldexp.c (fold_binary): Always make the result of SEGMENT_START section-relative. * testsuite/ld-scripts/segment-start.d: New test. * testsuite/ld-scripts/segment-start.ld: New test linker script. * testsuite/ld-scripts/segment-start.s: New test source. * testsuite/ld-scripts/script.exp: Run the new test.
This commit is contained in:
parent
a000f8817b
commit
6057dc97e4
10
ld/ChangeLog
10
ld/ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2018-09-14 Maciej W. Rozycki <macro@mips.com>
|
||||||
|
Maciej W. Rozycki <macro@linux-mips.org>
|
||||||
|
|
||||||
|
* ldexp.c (fold_binary): Always make the result of SEGMENT_START
|
||||||
|
section-relative.
|
||||||
|
* testsuite/ld-scripts/segment-start.d: New test.
|
||||||
|
* testsuite/ld-scripts/segment-start.ld: New test linker script.
|
||||||
|
* testsuite/ld-scripts/segment-start.s: New test source.
|
||||||
|
* testsuite/ld-scripts/script.exp: Run the new test.
|
||||||
|
|
||||||
2018-09-14 Maciej W. Rozycki <macro@linux-mips.org>
|
2018-09-14 Maciej W. Rozycki <macro@linux-mips.org>
|
||||||
|
|
||||||
* ldexp.c (fold_binary): Check that `config.maxpagesize' is
|
* ldexp.c (fold_binary): Check that `config.maxpagesize' is
|
||||||
|
|
|
@ -534,6 +534,7 @@ fold_binary (etree_type *tree)
|
||||||
operand, binary.rhs is first operand. */
|
operand, binary.rhs is first operand. */
|
||||||
if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
|
if (expld.result.valid_p && tree->type.node_code == SEGMENT_START)
|
||||||
{
|
{
|
||||||
|
bfd_vma value = expld.result.value;
|
||||||
const char *segment_name;
|
const char *segment_name;
|
||||||
segment_type *seg;
|
segment_type *seg;
|
||||||
|
|
||||||
|
@ -551,9 +552,10 @@ fold_binary (etree_type *tree)
|
||||||
"isn't multiple of maximum page size\n"),
|
"isn't multiple of maximum page size\n"),
|
||||||
segment_name);
|
segment_name);
|
||||||
seg->used = TRUE;
|
seg->used = TRUE;
|
||||||
new_rel_from_abs (seg->value);
|
value = seg->value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
new_rel_from_abs (value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -231,3 +231,7 @@ foreach test_script $test_script_list {
|
||||||
|
|
||||||
run_dump_test "align-with-input"
|
run_dump_test "align-with-input"
|
||||||
run_dump_test "pr20302"
|
run_dump_test "pr20302"
|
||||||
|
|
||||||
|
run_dump_test "segment-start" {{name (default)}}
|
||||||
|
run_dump_test "segment-start" {{name (overridden)} \
|
||||||
|
{ld -Ttext-segment=0x10000000}}
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
#PROG: nm
|
||||||
|
#name: SEGMENT_START expression not absolute
|
||||||
|
#source: segment-start.s
|
||||||
|
#ld: -e 0 -u __executable_start -T segment-start.ld
|
||||||
|
#xfail: mmix-*-* pdp11-*-* powerpc-*-aix* powerpc-*-beos* rs6000-*-* sh-*-pe
|
||||||
|
#xfail: c30-*-*aout* tic30-*-*aout* c54x*-*-*coff* tic54x-*-*coff*
|
||||||
|
# XFAIL targets that are not expected to handle SEGMENT_START correctly.
|
||||||
|
|
||||||
|
# Make sure `__executable_start' is regular:
|
||||||
|
#
|
||||||
|
# 10000000 T __executable_start
|
||||||
|
#
|
||||||
|
# not absolute:
|
||||||
|
#
|
||||||
|
# 10000000 A __executable_start
|
||||||
|
|
||||||
|
#...
|
||||||
|
0*10000000 T __executable_start
|
||||||
|
#pass
|
|
@ -0,0 +1,12 @@
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
PROVIDE (__executable_start = SEGMENT_START ("text-segment", 0x10000000));
|
||||||
|
.text : { *(.text) }
|
||||||
|
.data : { *(.data) }
|
||||||
|
.bss : { *(.bss) }
|
||||||
|
.loader : { *(.loader) }
|
||||||
|
.symtab : { *(.symtab) }
|
||||||
|
.strtab : { *(.strtab) }
|
||||||
|
.shstrtab : { *(.shstrtab) }
|
||||||
|
/DISCARD/ : { *(*) }
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
.text
|
||||||
|
.space 16
|
Loading…
Reference in New Issue