PR ld/13683

* ldlang.c (lang_process): Rerun lang_do_assignments before
	starting garbage collection.
	* ldexp.c (fold_name): Generate a reloc for defined symbols
	found without an associated output section during the mark phase.
	(exp_fold_tree_1): Continue processing an expression, even if we
	are unable to fold it, if we are in the first two evaluation
	phases.
	* ldexp.h (enum lang_phase_type): Add descriptions of the phases.

	* ld-gc/pr13683.c: New test source file.
	* ld-gc/pr13683.d: New test control and output file.
	* ld-gc/gc.exp: Run the pr13683 test.

	* ld-cris/tls-gc-68: Update expected symbol table dump.
	* ld-cris/tls-gc-69: Likewise.
	* ld-cris/tls-gc-70: Likewise.
	* ld-cris/tls-gc-71: Likewise.
	* ld-cris/tls-gc-75: Likewise.
	* ld-cris/tls-gc-76.d: Likewise.
	* ld-cris/tls-gc-79.d: Likewise.
This commit is contained in:
Nick Clifton 2012-02-22 16:27:35 +00:00
parent feea76c262
commit 2aa9aad989
15 changed files with 108 additions and 24 deletions

View File

@ -1,3 +1,12 @@
2012-02-22 Alan Modra <amodra@gmail.com>
PR ld/13683
* ldlang.c (lang_process): Rerun lang_do_assignments before
starting garbage collection.
* ldexp.c (fold_name): Generate a reloc for defined symbols
found without an associated output section during the mark phase.
* ldexp.h (enum lang_phase_type): Add descriptions of the phases.
2012-02-19 Kai Tietz <ktietz@redhat.com>
* deffilep.y (cmp_import_elem): Sort first by module name.

View File

@ -590,7 +590,9 @@ fold_name (etree_type *tree)
output_section = h->u.def.section->output_section;
if (output_section == NULL)
{
if (expld.phase != lang_mark_phase_enum)
if (expld.phase == lang_mark_phase_enum)
new_rel (h->u.def.value, h->u.def.section);
else
einfo (_("%X%S: unresolvable symbol `%s'"
" referenced in expression\n"),
tree, tree->name.name);
@ -882,7 +884,7 @@ exp_fold_tree_1 (etree_type *tree)
exp_fold_tree_1 (tree->assign.src);
if (expld.result.valid_p
|| (expld.phase == lang_first_phase_enum
|| (expld.phase <= lang_mark_phase_enum
&& tree->type.node_class == etree_assign
&& tree->assign.hidden))
{

View File

@ -94,11 +94,19 @@ typedef union etree_union {
} assert_s;
} etree_type;
typedef enum {
/* Expression evaluation control. */
typedef enum
{
/* Parsing linker script. Will only return "valid" for expressions
that evaluate to a constant. */
lang_first_phase_enum,
/* Prior to section sizing. */
lang_mark_phase_enum,
/* During section sizing. */
lang_allocating_phase_enum,
/* During assignment of symbol values when relaxation in progress. */
lang_assigning_phase_enum,
/* Final assignment of symbol values. */
lang_final_phase_enum
} lang_phase_type;

View File

@ -6650,6 +6650,11 @@ lang_process (void)
files. */
ldctor_build_sets ();
/* PR 13683: We must rerun the assignments prior to running garbage
collection in order to make sure that all symbol aliases are resolved. */
lang_do_assignments (lang_mark_phase_enum);
expld.phase = lang_first_phase_enum;
/* Remove unreferenced sections if asked to. */
lang_gc_sections ();

View File

@ -1,3 +1,18 @@
2012-02-22 Nick Clifton <nickc@redhat.com>
PR ld/13683
* ld-gc/pr13683.c: New test source file.
* ld-gc/pr13683.d: New test control and output file.
* ld-gc/gc.exp: Run the pr13683 test.
* ld-cris/tls-gc-68: Update expected symbol table dump.
* ld-cris/tls-gc-69: Likewise.
* ld-cris/tls-gc-70: Likewise.
* ld-cris/tls-gc-71: Likewise.
* ld-cris/tls-gc-75: Likewise.
* ld-cris/tls-gc-76.d: Likewise.
* ld-cris/tls-gc-79.d: Likewise.
2012-02-20 Thomas Schwinge <thomas@schwinge.name>
* ld-elf/comm-data.exp: Run for *-*-gnu*.

View File

@ -21,11 +21,11 @@ private flags = 0:
SYMBOL TABLE:
0+80074 l d .text 0+ .text
0+82078 l d .got 0+ .got
0+82084 l \*ABS\* 0+ __bss_start
0+82084 l \*ABS\* 0+ _edata
0+82078 l O .got 0+ _GLOBAL_OFFSET_TABLE_
0+820a0 l \*ABS\* 0+ _end
0+80074 g .text 0+ _start
0+82084 g \*ABS\* 0+ __bss_start
0+82084 g \*ABS\* 0+ _edata
0+820a0 g \*ABS\* 0+ _end
Contents of section .text:
80074 41b20+ .*

View File

@ -22,11 +22,11 @@ private flags = 0:
SYMBOL TABLE:
0+80074 l d .text 0+ .text
0+82078 l d .got 0+ .got
0+82084 l \*ABS\* 0+ __bss_start
0+82084 l \*ABS\* 0+ _edata
0+82078 l O .got 0+ _GLOBAL_OFFSET_TABLE_
0+820a0 l \*ABS\* 0+ _end
0+80074 g .text 0+ _start
0+82084 g \*ABS\* 0+ __bss_start
0+82084 g \*ABS\* 0+ _edata
0+820a0 g \*ABS\* 0+ _end
Contents of section .text:
80074 41b20+ .*

View File

@ -22,11 +22,11 @@ private flags = 0:
SYMBOL TABLE:
0+80074 l d .text 0+ .text
0+82078 l d .got 0+ .got
0+82084 l \*ABS\* 0+ __bss_start
0+82084 l \*ABS\* 0+ _edata
0+82078 l O .got 0+ _GLOBAL_OFFSET_TABLE_
0+820a0 l \*ABS\* 0+ _end
0+80074 g .text 0+ _start
0+82084 g \*ABS\* 0+ __bss_start
0+82084 g \*ABS\* 0+ _edata
0+820a0 g \*ABS\* 0+ _end
Contents of section .text:
80074 41b20+ .*

View File

@ -17,11 +17,11 @@
DYNAMIC SYMBOL TABLE:
0+18e l d .text 0+ .text
0+2194 l d .tdata 0+ .tdata
0+2280 l D \*ABS\* 0+ __bss_start
0+2280 l D \*ABS\* 0+ _edata
0+2280 l D \*ABS\* 0+ _end
0+18e g DF .text 0+2 _init
0+2280 g D \*ABS\* 0+ __bss_start
0+ g D .tdata 0+80 tls128
0+2280 g D \*ABS\* 0+ _edata
0+2280 g D \*ABS\* 0+ _end
DYNAMIC RELOCATION RECORDS \(none\)
#...

View File

@ -24,11 +24,11 @@ private flags = 0:
SYMBOL TABLE:
0+80074 l d .text 0+ .text
0+82078 l d .got 0+ .got
0+82084 l \*ABS\* 0+ __bss_start
0+82084 l \*ABS\* 0+ _edata
0+82078 l O .got 0+ _GLOBAL_OFFSET_TABLE_
0+820a0 l \*ABS\* 0+ _end
0+80074 g .text 0+ _start
0+82084 g \*ABS\* 0+ __bss_start
0+82084 g \*ABS\* 0+ _edata
0+820a0 g \*ABS\* 0+ _end
Contents of section .text:
80074 41b20+ .*

View File

@ -23,11 +23,11 @@ SYMBOL TABLE:
0+82080 l d .got 0+ .got
0+82090 l d .data 0+ .data
0+82090 l O .data 0+4 gc76var
0+82094 l \*ABS\* 0+ __bss_start
0+82094 l \*ABS\* 0+ _edata
0+82080 l O .got 0+ _GLOBAL_OFFSET_TABLE_
0+820a0 l \*ABS\* 0+ _end
0+80074 g .text 0+ _start
0+82094 g \*ABS\* 0+ __bss_start
0+82094 g \*ABS\* 0+ _edata
0+820a0 g \*ABS\* 0+ _end
0+80078 g F .text 0+6 gc76fn
Contents of section .text:

View File

@ -22,11 +22,11 @@ private flags = 0:
SYMBOL TABLE:
0+80074 l d .text 0+ .text
0+82078 l d .got 0+ .got
0+82084 l \*ABS\* 0+ __bss_start
0+82084 l \*ABS\* 0+ _edata
0+82078 l O .got 0+ _GLOBAL_OFFSET_TABLE_
0+820a0 l \*ABS\* 0+ _end
0+80074 g .text 0+ _start
0+82084 g \*ABS\* 0+ __bss_start
0+82084 g \*ABS\* 0+ _edata
0+820a0 g \*ABS\* 0+ _end
Contents of section .text:
80074 41b20+ .*

View File

@ -120,3 +120,8 @@ if { [is_remote host] || [which $CC] != 0 } {
run_dump_test "pr11218"
}
}
if { [is_remote host] || [which $CC] != 0 } {
ld_compile "$CC $CFLAGS $cflags" $srcdir/$subdir/pr13683.c tmpdir/pr13683.o
run_dump_test "pr13683"
}

View File

@ -0,0 +1,28 @@
void foo(void);
int main(void)
{
foo ();
for (;;)
;
}
int a;
void foo1(void)
{
a = 1;
}
void foo2(void)
{
a = 2;
}
void foo3(void)
{
a = 3;
}

View File

@ -0,0 +1,12 @@
#name: --gc-sections with --defsym
#source: dummy.s
#ld: --gc-sections -e main --defsym foo=foo2 tmpdir/pr13683.o
#nm: --format=bsd
#xfail: sh64*-*-* iq2000-*-* lm32-*-* epiphany-*-* mips64vr-*-* frv-*-* m32c-*-* rl78-*-* rx-*-* sh-*-*
# Note - look for both "foo" and "foo2" being defined, non-zero function symbols
#...
0+[1-9a-f]+[0-9a-f]*[ ]T[ ]_*foo
0+[1-9a-f]+[0-9a-f]*[ ]T[ ]_*foo2
#...