+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.
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);
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))
{
} 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;
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 ();
+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*.
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+ .*
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+ .*
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+ .*
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\)
#...
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+ .*
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:
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+ .*
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"
+}
--- /dev/null
+void foo(void);\r
+\r
+int main(void)\r
+{\r
+ foo ();\r
+\r
+ for (;;)\r
+ ;\r
+}\r
+\r
+int a;\r
+\r
+void foo1(void)\r
+{\r
+ a = 1;\r
+}\r
+\r
+void foo2(void)\r
+{\r
+ a = 2;\r
+}\r
+\r
+void foo3(void)\r
+{\r
+ a = 3;\r
+}\r
+\r
+\r
--- /dev/null
+#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
+#...